【问题标题】:How to write a Sqoop Job using shell script如何使用 shell 脚本编写 Sqoop 作业
【发布时间】:2016-01-13 03:34:24
【问题描述】:

我的用例:

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

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

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

【问题讨论】:

    标签: sqoop


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      !/bin/bash 表名=${^^1} HDFSPATH=${^^2} 现在=$(日期 +"%m-%d-%Y-%H-%M-%S") sqoop --import --connect jdbc:db2://mystsrem:60000/SCHEMA \ --用户名用户名\ --password-文件密码\ --query "从 ${TABLENAME} \$CONDITIONS 中选择 *" \ -m 1 \ --删除目标目录\ --target-dir ${HDFSPATH} \ --获取大小 30000 \ --类名 ${TABLENAME} \ --fields-terminated-by '\01' \ --lines-terminated-by '\n' \ --escaped-by '\' \ --verbose &> logonly/${TABLENAME}_import_${NOW}.log

      可选: 如果你需要导入到 hive 表中

      --hive-drop-import-delims \ --蜂巢导入\ --蜂巢覆盖\ --hive-table HiveSchema.${TABLENAME}

      【讨论】:

      猜你喜欢
      • 2015-08-07
      • 1970-01-01
      • 2010-09-15
      • 2012-02-23
      • 1970-01-01
      • 2011-06-24
      • 2016-11-07
      • 1970-01-01
      • 2019-11-10
      相关资源
      最近更新 更多