一、需求和方案总述
- 需求:将MySQL 的83张表先全量 导入 Hive 数仓,然后增量的导入新增的数据到 Hive 数仓 ods 层。
- 解决方案:创建临时表,将每张表的信息插入到临时表,将 MySQL 临时表信息导出到本地,然后创建 83 个Sqoop job, 最后执行 Sqoop job就可以实现 83 张表的增量导入,前提就是83 张表中都有 时间字段,Sqoop 监控这个时间字段就可以。
二、Sqoop Job
1. Sqoop job 使用示例
1.查询 job 列表
[root@hdp301 ~]# sqoop job --list
2.删除 job
[root@hdp301 ~]# sqoop job --delete kangll
3.创建测试 job
sqoop job --create kangll -- import --connect jdbc:mysql://192.168.2.226:3306/yx \
--table stat_url_count \
--username root \
--password winner@001 -m 1 \
--hive-import \
--hive-table dwd_url_count \
--external-table-dir /yax/dwd/sfyp_test.db/dwd_url_count \
--incremental append \
--check-column last_timestamp \
--last-value '2015-11-30 16:59:43.1' \
--fields-terminated-by "\001"
4.执行 job
[root@hdp301 ~]# sqoop job -exec kangll
打印的日志
5.运行结果查看
为什么要创建 Sqoop job , 因为 job 可以在 /root/.sqoop/metastore.db.script 保存监控的最近的 时间戳字段,如果不使用 Sqoop job 保存,默认是会如下的效果 ,拿到 给的初始的值和查出的最大值更新插入
6.MySQL中 新插入两条数据
7.日志中 显示查询的方式
8.查询 hive 表中的数据
2. Sqoop 增量导入
注意:Sqoop 不支持 mysql转hive时使用 lastmodified 模式进行增量导入
nohup sqoop import -Dorg.apache.sqoop.splitter.allow_text_splitter=true \ --connect ${driver} \ --username ${dbUsername} \ --password ${dbPasswd} \ --table "${tableName}" \ --hive-import \ --hive-database data_exchange \ --hive-table "${tableName}" \ --hive-partition-key "dt" \ --hive-partition-value "${date}" \ --fields-terminated-by '\001' \ --external-table-dir "/winhadoop/ods/data_exchange.db/${tableName}" \ --check-column jhpt_update_time \ --incremental append \ --last-value '1990-02-02 12:21:21' \ --target-dir "/sqoop/data/append/" \ --m 1 \ --null-string '\\N' \ --null-non-string '\\N' \ --mapreduce-job-name data_exchange_${tableName} >> ${sfyp_log}/ods_data_exchange.${date}.log
还有一点: sqoop job 密码 保存 用参数
--password-file /input/sqoop/pwd/sqoopPWD.pwd
创建保存密码的文件,上传到HDFS
echo -n "hadoop" > sqoopPWD.pwd
hdfs dfs -mkdir -p /input/sqoop/pwd/sqoopPWD.pwd
echo -n "hadoop" > sqoopPWD.pwd
hdfs dfs -mkdir -p /input/sqoop/pwd/sqoopPWD.pwd
hdfs dfs -put sqoopPWD.pwd /input/sqoop/pwd
hdfs dfs -chmod 400 /input/sqoop/pwd/sqoopPWD.pwd