如何使用shell脚本编写Sqoop作业

时间:2016-01-13 03:34:24

标签: sqoop

我的用例:

在mysql db中创建逐日小时表。我需要使用Sqoop每天将它们移动到HDFS并使用Impala处理HDFS数据。

如何编写shell脚本或作业,只是为了定期将新创建的表数据移动到HDFS(现有文件系统)?

今天是2016年1月3日,当我今天运行我的工作时,2016年1月2日数据应该从mysql移动到HDFS,每天应该移动前一天的数据。 每天我需要在此HDFS群集上运行我的Impala查询并生成报告 如何使用Impala处理整个数据并生成报告?

2 个答案:

答案 0 :(得分:1)

Sqoop支持增量导入:http://sqoop.apache.org/docs/1.4.6/SqoopUserGuide.html#_incremental_imports

Sqoop-import可以使用最后修改的时间戳或始终增加的行ID来决定要导入的行。您需要提供--last-value参数。您可以在作业之间存储最后一个值,也可以在运行作业之前从Impala数据库中检索它。

答案 1 :(得分:1)

最好的方法是获取带有2个参数的shell脚本。 1将是表的名称,而其他将是hdfs路径,因为这些将是您的方案中唯一更改的2个因素。下面是您可以放入.sh并在bash中运行的示例脚本。


    !/bin/bash 

    TABLENAME=${^^1} 
    HDFSPATH=${^^2} 
    NOW=$(date +"%m-%d-%Y-%H-%M-%S") 

    sqoop --import --connect jdbc:db2://mystsrem:60000/SCHEMA \
     --username username \
     --password-file password \
     --query "select * from ${TABLENAME} \$CONDITIONS" \
     -m 1 \
     --delete-target-dir \
     --target-dir ${HDFSPATH} \
     --fetch-size 30000 \
     --class-name ${TABLENAME} \
     --fields-terminated-by '\01' \
     --lines-terminated-by '\n' \
     --escaped-by '\' \
     --verbose &> logonly/${TABLENAME}_import_${NOW}.log

OPTIONAL: 如果你需要导入hive表

- hive-drop-import-delims \ --hive-import \ --hive-overwrite \ --hive-table HiveSchema。$ {TABLENAME}