sqoop 简介及使用

1. 前言

Sqoop是用于在Hadoop和关系型数据库之间流转数据的工具。可以使用Sqoop从关系型数据库(RDBMS)比如Mysql或者Oracle导入数据到Hadoop分布式文件系统上,在Hadoop MapReduce上对数据做转换,然后导回到RDBMS上。 借助数据库的Schema描述信息,Sqoop自动实现了上述的很多过程,Sqoop使用MapReduce去导入和导出数据,这样可以提供并行操作以及提高容错能力。

2. Sqoop的Shell(命令行客户端)操作

usage: sqoop COMMAND [ARGS]

Available commands:
  codegen            生成Java代码
  create-hive-table  根据表结构生成hive表
  eval               执行SQL语句并显示结果
  export             导出HDFS目录到数据库表
  help               帮助
  import             从数据库导入数据到HDFS
  import-all-tables  导入数据库所有表到HDFS
  list-databases     列举所有的database
  list-tables        列举数据库中的所有表
  version            查看版本信息

2.1 sqoop import

2.1.1 命令行客户端支持的命令参数

2.1.2 公共参数

--connect <jdbc-url> 制定JDBC连接串

--connection-manager <class-name> 指定连接管理类名

--driver <class-name> 指定JDBC驱动类

--hadoop-mapred-home <dir> 覆盖$HADOOP_MAPRED_HOME

--help 帮助

--password-file 指定密码文件

-P 从命令行读取密码

--password <password> 指定密码

--username <username> 指定用户名

--verbose 显示更丰富的日志

--connection-param-file <filename> 连接参数的可选配置文件

2.1.3 连接一个数据库

使用--conenct来连接数据库 $ sqoop import --connect jdbc:mysql://database.example.com/employees

这个连接串会连接database.example.com服务器上的employees数据库。必须要注意如果你准备在分布式Hadoop集群使用Sqoop导入数据,你不能使用localhost作为Url来连接数据源,因为这个连接串会被应用于你的MapReduce集群的任务节点上。 指定数据库连接后,需要提供数据库访问的用户名和密码,密码有多种设定方式,显式的指定密码是不安全的

Sqoop内置了MySql的驱动,对于其他的,需要自己安装驱动,将驱动文件放到$SQOOP_HOME/lib目录下,然后使用--driver参数指定驱动的全类名

当使用JDBC连接一个数据库时,也可以使用--connection-param-file参数来通过一个配置文件指定额外的参数,这个文件会被作为标准的Java配置来解析并传递给驱动来创建连接。

2.1.4 Import 配置参数

--append 追加数据到HDFS中已有的数据文件

--as-avrodatafile 导入数据为Avro格式

--as-sequencefile 导入数据为SqeuqnceFile

--as-textfile 导入数据格式为textfile(默认)

--as-parquetfile 导入数据为Parquet格式

--boundary-query <statement> 覆盖创建分割时的边界查询SQL

--columns <col,col,col…> 指定导入列

--delete-target-dir 如果存在,删除导入的target目录

--direct 如果数据源支持,使用direct模式导入

-m,--num-mappers <n> 指定并行导入数据的map数量(正整数),默认为4个

-e,--query <statement> 导入查询语句得到的数据

--split-by <column-name> 指定分割split的字段

--table < table-name > 制定数据库中的表名

--target-dir < dir > 目标HDFS路径

--warehouse-dir <dir> 表目标位置父路径

--where <where clause> 导入的过滤条件,即sql语句的where条件

--null-string < null-string > 源表中为null的记录导入为string类型时显示为null-string,默认显示为”null”

--null-non-string <null-string> 源表中为null的记录导入为非string类型时显示为null-string,默认显示为”null”

2.2 sqoop export

2.2.1 命令行客户端支持的命令参数

2.2.2 公共参数

--connect <jdbc-url> 制定JDBC连接串

--connection-manager <class-name> 指定连接管理类名

--driver <class-name> 指定JDBC驱动类

--hadoop-mapred-home <dir> 覆盖$HADOOP_MAPRED_HOME

--help 帮助

--password-file 指定密码文件

-P 从命令行读取密码

--password <password> 指定密码

--username <username> 指定用户名

--verbose 显示更丰富的日志

--connection-param-file <filename> 连接参数的可选配置文件

2.2.3 Export 配置参数

--columns < col,col,col… > 指定导出字段

--direct 使用direct模式

--export-dir <dir> 导出HDFS文件路径

-m,--num-mappers <n> 指定并行导出数据的map个数,默认为4个

--table <table-name> 指定数据库中的表名

--update-key <col-name> update模式下更新的字段,多个字段使用逗号分割

--update-mode <mode> 当一条数据找不到对应的记录时的操作,默认为updateonly即忽略插入操作,可以设置为allowinsert即遇到新记录会插入

--input-null-string <null-string> string类型字段表示null值的字符

--input-null-non-string <null-string> 非string类型字段表示null值的字符 --staging-table < staging-table-name > 在最终导出到目标表之前临时存储这些记录的表 --clear-staging-table 启用清除staging-table表中的记录

--export-dir参数,以及--table或者--call是必须指定的参数。因为这三个参数分别用来指定导出数据集,以及数据导出后的去处,既可以是导出到某张表,也可以是对每一条导出记录调用存储过程。有些数据库例如Mysql可以支持direct模式导出(在mysql中就是调用mysqldump导出数据)。

由于Sqoop将导出过程切分成了多个,那么就会有可能某个导出任务失败而导致只有部分数据提交到了导出数据库中。当失败job重试时,就有可能会出现数据重复,或者导出数据冲突等情况发生。这时可以指定一个--staging-table参数来避免这种情况的发生。导出的数据首先会缓存在该表中,最后等job执行成功后会将该表中的数据移动到最终目标表中。

2.3 其他配置

2.3.1 使用HCatalog

--hcatalog-database 指定hcatalog表的数据库名

--hcatalog-table 指定表名

--hcatalog-home HCatalog安装目录

2.3.2 Hive配置

--hive-home 指定hive home目录

--hive-partition-key 指定写入hive时的分区key

--hive-partition-value 指定写入hive时的分区value

Last updated

Was this helpful?