Sqoop 使用笔记
安装 略
导入HDFS
导入命令
sqoop import --username root --password password --connect jdbc:mysql://127.0.0.1/hadoop --table archive
如果数据库table没有主键,会有error打印,如下:
Error during import: No primary key could be found for table archive. Please specify one with --split-by or perform a sequential import with '-m 1'.
如错误说提示,这时需要添加参数 --split-by,命令如下:
sqoop import --username root --password password --connect jdbc:mysql://127.0.0.1/hadoop --table archive --split-by id
如果不想每次输入用户名和密码,可以如此做
cat > .sqoop_import.txt << EOF
> import --username
> wiki_write
> --password
> wiki_write
> EOF
导入命令可以如此写:
sqoop --options-file .sqoop_import.txt --connect jdbc:mysql://172.16.1.201/hadoop --table archive
条件导入
read -d '' query << "EOF"
> SELECT DOC_TITLE,ARCHIVE_TITLE,CREATE_NICK,NEWS_SUMMARY FROM hadoop.archive where create_time > '2016-01-01 00:00:00'
> AND $CONDITIONS
> EOF
Sqoop 的宏$CONDITIONS必须放在where查询语句中使用,它可以在mysql查询中替换limit和offset选项
导入命令:
sqoop --options-file .sqoop_import.txt --query "$query" --split-by id --target-dir /user/hadoop/2016-archive
数据分割
默认情况下,Sqoop 运行4个map任务,可以使用 --num-mappers属性调整map任务数量 。
Sqoop的第一步是从数据库提取元数据,它检查需要被导入的表的主键,还需要运行一个查询确定数据量的上下限(select MIN(id) , MAX(id) FROM archive)。有些还需要使用map任务分布式并行导入数据分片,从而将数据分成与map任务同样个数的数据分片,这个数据分片包含一个主键的最大最小值,然后,每个map人物执行一个包含一些列主键的独立查询。
--boundary-query 参数可以构建一个替代查询,用于确定最大最小值。
增量导入
Sqoop支持两种增量方式: append 和 lastmodified。 lastmodified 需要记录有时间戳。这两种情况下,通过设置--check-column 选项指定列,通过设置 --incremental 参数指定模式,通过实际使用值 --last-value确定增量的变化。
sqoop --options-file .sqoop_import.txt
> --check-column "create_time"
> --incremental "lastmodified"
> --last-value "2016-01-01"
> --table archive
结果如下:
……
16/03/18 16:26:17 INFO tool.ImportTool: Incremental import complete! To run another incremental import of all data following this import, supply the following arguments:
16/03/18 16:26:17 INFO tool.ImportTool: --incremental lastmodified
16/03/18 16:26:17 INFO tool.ImportTool: --check-column CREATE_TIME
16/03/18 16:26:17 INFO tool.ImportTool: --last-value 2016-03-18 16:35:07.0
16/03/18 16:26:17 INFO tool.ImportTool: (Consider saving this with 'sqoop job --create')
……
Sqoop作业和元数据存储
在命令末尾输出,可以看到递增列的最后一个值。全自动化的数据导入工作肯定是要想起的时候指定重用这个值。
sqoop job --create archive_increment -- import
> --append
> --check-column "CREATE_TIME"
> --incremental "lastmodified"
> --last-value "2016-01-01"
> --connect jdbc:mysql://172.16.1.201/hadoop
> --username root
> --table archive
> --split-by id
> --num-mappers 2
sqopp job -list
sqoop job --exec archive_increment
#显示作业的元数据信息
sqoop job --show archive_increment
元数据包括增量列的最后一个值,这个值是执行命令的时间,并不是在表上看的最后一个值。
incremental.last.value = 2016-03-18 16:58:17.0
快速mysql导入
sqoop --options-file .sqoop_import.txt --direct --table archive --split-by id --num-mappers 2
快速连接器的缺点:只有mysql和postgreSQL支持快速链接器,而且快速链接器也只能处理文本输出文件,不能处理Avro和SequenceFile格式文件。