我们如何在SQOOP中自动增量导入?

时间:2016-01-13 16:04:31

标签: hadoop mapreduce sqoop

我们如何在SQoop中自动化增量导入?

在增量导入中,我们需要让--last-value从最后一个值开始导入,但我的工作是经常从RDBMS导入,我不想手动给出最后一个值,我们有什么方法可以自动化这个过程吗?

4 个答案:

答案 0 :(得分:5)

@Durga Viswanath Gadiraju的另一种方法回答。

如果要将数据导入配置单元表,则可以从配置单元表中查询上次更新的值,并将该值传递给sqoop导入查询。 您可以使用shell脚本或oozie操作来实现此目的。

Shell脚本:

lastupdatedvalue=`hive -e 'select last_value from table` #tweak the selection query based on the logic.

sqoop import --connect jdbc:mysql://localhost:3306/ydb --table yloc --username root -P --incremental append --last-value ${lastupdatedvalue}

Oozie方法:

  1. 基于逻辑检索的select查询的Hive操作 最后更新的价值。
  2. 来自先前配置单元件的捕获输出的增量负载的Sqoop操作。
  3. PFB sudo工作流​​程:

    <workflow-app name="sqoop-to-hive" xmlns="uri:oozie:workflow:0.4">
    <start to="hiveact"/>
    <action name="hiveact">
        <hive xmlns="uri:oozie:hive-action:0.2">
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <configuration>
                <property>
                    <name>mapred.job.queue.name</name>
                    <value>${queueName}</value>
                </property>
            </configuration>
            <script>script.sql</script>
    <capture-output/>
        </hive>    
        <ok to="sqoopact"/>
        <error to="kill"/>
    
    <action name="sqoopact">
        <sqoop xmlns="uri:oozie:sqoop-action:0.2">
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <command>import --connect jdbc:mysql://localhost:3306/ydb --table yloc --username root -P --incremental append --last-value ${wf:actionData('hiveact')}</command>
         </sqoop>
        <ok to="end"/>
        <error to="kill"/>
    </action>
    <kill name="kill">
        <message>Action failed</message>
    </kill>
    <end name="end"/>
    

    希望这有帮助。

答案 1 :(得分:3)

您可以利用内置的Sqoop Metastore

您可以使用以下内容创建简单的增量导入作业 命令:

sqoop job \     --create&lt;&gt; \      - \     进口     --connect&lt;&gt; \     --username&lt;&gt; \     --password&lt;&gt; \      - 表&lt;&gt; \      - 增加附加     --check-&LT;&GT; \     --last-value 0

然后使用--exec参数启动它:

sqoop job --exec <<Job Name>>

Sqoop会自动将最后导入的值序列化为 每次成功增量工作后的Metastore

答案 2 :(得分:1)

这可以很轻松地实现。

1。创建一个临时作业(“导入”前有一个空格)

sqoop job     --create JobName6 \
           -- import  \
                --connect jdbc:mysql://localhost:3306/retail_db \
                --username=username \
                --password-file /user/sqoop/password \
                --table departments \
                --target-dir /user/hive/warehouse/test.db/departments \
                --table departments \
                --split-by department_id \
                --check-column department_id \
                --incremental append \
               --last-value 0;

2。运行清理作业 sqoop作业--exec JobName6; 检查HDFS中位置的值

3。在源表(mysql)中插入一些数据 插入部门VALUES(9,'New Data1'),(10,'New Data2');

2。再次运行sqoop作业。 sqoop作业--exec JobName6; 再次检查HDFS中该位置的值。

类似地用于Hive导入

sqoop job     --create JobName1 \
           -- import  \
                --connect jdbc:mysql://localhost:3306/retail_db \
                --username=username\
                --password-file /user/sqoop/password \
                --table departments \
                --hive-import \
                --hive-table department \
                --split-by department_id \
                --check-column department_id \
                --incremental append \
               --last-value 0; 

答案 3 :(得分:0)

获得它的一种方法:

在数据库中创建日志表并开发增量导入,如下所示

Query the log table using sqoop eval command with the last value from last run
Run the sqoop import
Update the log table with the latest valueusing sqoop eval command

您需要自动执行sqoop evalsqoop importsqoop eval的流程。您可以使用sqoop eval向任何已连接的数据库提交任何有效查询。因此,您可以在导入之前运行select query以获取上次运行的最后一个值,并运行update query以使用当前运行的最后一个值更新日志表。