- Sqoop做为关系型数据库RDBMS和大数据平台(HDFS,Hive,Hbase等)导入导出工具,如果不熟悉其参数作用,使用起来各种问题,本文作为博主对Sqoop的实践作出一定的总结,如有错误,仅供参考。
Sqoop Job
-
Sqoop job 的是给使用者提供一个封装sqoop job的功能,其作用是可以自动更新job 的meta信息,让增量导入时指定的last-value自动被更新记录,不用额外的使用其他手段记录信息。
-
Sqoop job操作:
创建job sqoop job --create <job-id> -- [import|export] #注意,创建导入导出job ,最后一个'--'后面要加一个空格 查看job sqoop job --show <job-id> #查看job的详细信息 查看job列表 sqoop job --list 删除job sqoop job --delete <job-id> 执行job sqoop job --exec <job-id>
-
Sqoop ‘- -password /- -password-file’ 参数
sqoop支持俩种密码的输入,一种直接传递(--password),一种使用文件(--password-file),直接在shell 上填写密码,sqoop会提示不要在命令行直接使用密码。 创建sqoop job时,如果直接在命令行使用密码(--password),是无效的,当你执行job时,依然会让你重新输入密码。
-
不输入密码的俩种方式:
1.修改sqoop-site.xml <property> <name>sqoop.metastore.client.record.password</name> <value>true</value> <description>If true, allow saved passwords in the metastore. </description> </property> 此种方式在第一次输入密码后,以后再执行就不需要输入密码 2.使用--password-file 指定密码文件,文件可以是本地文件系统,也可以是HDFS文件 echo -n 'password' > filename.password -n 参数表示不换行输出,当你的密码文件格式不正确时,执行job时会报错 java.sql.SQLException: Access denied for user 'xxx'@'xxxx' (using password: YES)
增量导入
-
限于篇幅,sqoop全量导入导出,这里就不再介绍
-
sqoop使用–incremental参数实现增量导入,有俩种模式:append和lastmodified
-
Append模式
必须参数: --check-column <column-name> #检查列,sqoop根据指定列来查询出大于last-value值的数据,实现增量导入,可以为自增的列,如id,也可以是自增的时间类型 --incremental append #指定append模式 --last-value <init-value> 此种模式,大于last-value的值会被追加到目标数据中,如果指定的是时间类型,那么之前数据被修改后,时间变动导致的增量会被追加,因此会有数据重复,一般指定自增的id。 eg: sqoop job --create job-id \ -- import \ --connect jdbc-url \ --username username \ --password-file password-file-path \ --table table-name \ --num-mappers 2 \ --split-by id \ --hive-import \ --hive-database db \ --hive-table table-name \ --check-column id \ --incremental append \ --last-value 0 \
APPEND 模式支持导入到HDFS和Hive
-
Lastmodified模式
-
lastmodified需要指定一个更新的时间列,会将大于指定时间列的值增量导入到目标数据源,被更新的数据行也会被导入,导入方式又分为append和merge-key俩种模式,需要注意的是,此种增量导入方式不支持直接导入到Hive
必须参数: --target-dir hdfs-path # HDFS路径 --check-column <column-name> #检查列,sqoop根据指定列来查询出大于last-value值的数据,实现增量导入,一般为日期时间类型 --incremental lastmodified #指定lastmodified模式 --last-value <init-value> --append 或--merge-key <column> eg: sqoop job --create job-id \ -- import \ --connect jdbc-url \ --username username \ --password-file password-file \ --table table \ --columns columns \ --num-mappers 1 \ --target-dir target-dir \ --fields-terminated-by '\t' \ --check-column check-column \ --incremental lastmodified \ --last-value "1970-01-01 08:00:00" \ --merge-key id
指定append时,更新和新增的数据会被追加到目标数据,指定merge-key时,更新的数据会和之前数据按照指定的key合并生成最新的数据,新增的数据会被追加,指定的key一般为主键,需要注意的是,如果target-dir 目录存在,那么该sqoop job会重新启动一个MapReduce作业按照merge-key更新之前的数据生成新的数据集,新生成的文件数量不受num-mappers参数影响
增量导出
-
Sqoop 增量导出基于hdfs数据,使用–export-dir指定,实现增量导出的关键是–export-dir 指定路径的数据是否是增量的,可以使用以下方式:
INSERT OVERWRITE TABLE/DIRECTORY 'table_name/directory_anme' SELECT...
-
增量导出也有俩种模式,allowinsert和updateonly,使用–update-mode 参数进行指定,allowinsert模式是对已存在的数据进行更新,新增的数据进行追加,前提是目标表存在主键,updateonly模式(默认)仅允许对存在的数据进行更新,更新指定的key,用–update-key参数指定
必要参数: --update-key <key> --update-mode <allowinsert/updateonly> eg: sqoop export --connect jdbc-url \ --username username \ --password password \ --table <targetTable> \ --fields-terminated-by ‘,’ \ --update-key key \ --update-mode allowinsert \ --export-dir export-dir