Sqoop使用笔记

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格式文件。

将数据导入Hive

用放荡不羁的心态过随遇而安的生活
原文地址:https://www.cnblogs.com/re-myself/p/5293000.html