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

Hadoop 我们如何在SQOOP中自动化增量导入?,hadoop,mapreduce,sqoop,Hadoop,Mapreduce,Sqoop,我们如何在SQoop中自动化增量导入 在增量导入中,我们需要给出--last value以从最后一个值开始导入,但我的工作是经常从RDBMS导入,我不想手动给出最后一个值,有什么方法可以使此过程自动化吗?一种方法: 在数据库中创建日志表,并按如下方式进行增量导入 Query the log table using sqoop eval command with the last value from last run Run the sqoop import Update the log tab

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

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

一种方法:

在数据库中创建日志表,并按如下方式进行增量导入

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 eval
sqoop导入
sqoop eval
的过程。您可以使用
sqoop eval
向连接的任何数据库提交任何有效查询。因此,您可以在导入之前运行select query to以获取上次运行的最后一个值,并运行update query以使用当前运行的最后一个值更新日志表。

另一种方法是@Durga Viswanath Gadiraju answer

如果要将数据导入配置单元表,可以从配置单元表中查询上次更新的值,并将该值传递给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方法:

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}
  • 基于逻辑的select查询的配置单元操作,以检索 上次更新的值
  • Sqoop操作,用于从上一个配置单元操作的捕获输出中获取增量负载
  • 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"/>
    
    
    ${jobTracker}
    ${nameNode}
    mapred.job.queue.name
    ${queueName}
    script.sql
    ${jobTracker}
    ${nameNode}
    导入--连接jdbc:mysql://localhost:3306/ydb --表yloc--username root-P--incremental append--last value${wf:actionData('hiveact')}
    行动失败
    


    希望这有帮助。

    您可以利用内置的Sqoop元存储

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

    sqoop作业\ --创造\ --\ 进口\ --连接\ --用户名\ --密码\ --桌子\ --增量追加\ --检查-\ --最后一个值0

    并以--exec参数开始:

    sqoop job --exec <<Job Name>>
    
    sqoop作业--exec
    
    Sqoop将自动将上次导入的值序列化回
    每次成功增量作业后的元存储

    这可以通过sqoop作业轻松实现

    1。创建sqoop作业(在“导入”之前有一个空格)

    2。运行sqoop作业 sqoop作业——执行作业名称6; 检查HDFS中位置中的值

    3。在源表中插入一些数据(mysql) 在部门值中插入(9,“新数据1”),(10,“新数据2”)

    2。再次运行sqoop作业。 sqoop作业——执行作业名称6; 再次检查HDFS中位置中的值

    类似于蜂巢导入

    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; 
    

    请详细说明。。如何将值传递给导入查询?