2016-01-13 479 views
2

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

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

回答

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查询以获取上次运行的最后一个值,并运行update query以使用当前运行的最后一个值更新日志表。

3

@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. 蜂巢行动的基础上检索 最后更新值的逻辑选择查询。
  2. 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"/> 

希望这有助于。

+0

请详细说明一下..你将如何传递值来导入查询? –

2

您可以利用内置的Sqoop metastore

您可以用下面的命令 创建一个简单的增量导入作业:

sqoop工作\ --create <> \ - \ 进口\ --connect <> \ --username <> \ --password <> \ --table <> \ --incremental追加\ --check- <> \ --last值为0

并与--exec参数启动:

sqoop job --exec <<Job Name>> 

Sqoop将自动序列化的最后一个进口值回到 每个成功增量作业后的metastore