2016-08-24 110 views
0

我有很多在AWS EMR中运行的sqoop作业,但有时我需要关闭此实例。保存sqoop增量导入id

有一种方法可以从增量导入中保存最后一个id,也许是localy,然后通过cronjob将它上传到s3。

我的第一个想法是,当我创建工作时,我只是通过bash脚本向Redshift发送一个请求,在那里存储数据并获取最后一个id或last_modified。

另一个想法是获取sqoop作业的输出--show $ jobid,筛选last_id的参数并使用它重新创建作业。

但我不知道sqoop是否提供了一种更简单的方法。

回答

1

解决方案

我更改文件sqoop-site.xml中和端点添加到我的MySQL 。

步骤

  1. 创建MySQL实例并运行此查询: CREATE TABLE SQOOP_ROOT (version INT, propname VARCHAR(128) NOT NULL, propval VARCHAR(256), CONSTRAINT SQOOP_ROOT_unq UNIQUE (version, propname));INSERT INTO SQOOP_ROOT VALUES(NULL, 'sqoop.hsqldb.job.storage.version', '0');

  2. 改变原有sqoop-site.xml中加入你的MySQL端点,用户名和密码。

<property> 
    <name>sqoop.metastore.client.enable.autoconnect</name> 
    <value>true</value> 
    <description>If true, Sqoop will connect to a local metastore 
     for job management when no other metastore arguments are 
     provided. 
    </description> 
    </property> 


    <!-- 
    The auto-connect metastore is stored in ~/.sqoop/. Uncomment 
    these next arguments to control the auto-connect process with 
    greater precision. 
    --> 

    <property> 
    <name>sqoop.metastore.client.autoconnect.url</name> 
    <value>jdbc:mysql://your-mysql-instance-endpoint:3306/database</value> 
    <description>The connect string to use when connecting to a 
     job-management metastore. If unspecified, uses ~/.sqoop/. 
     You can specify a different path here. 
    </description> 
    </property> 
    <property> 
    <name>sqoop.metastore.client.autoconnect.username</name> 
    <value>${sqoop-user}</value> 
    <description>The username to bind to the metastore. 
    </description> 
    </property> 
    <property> 
    <name>sqoop.metastore.client.autoconnect.password</name> 
    <value>${sqoop-pass}</value> 
    <description>The password to bind to the metastore. 
    </description> 
    </property> 

当你在执行第一次命令sqoop job --list它将返回零个值。但创建作业后,如果关闭EMR,则不会丢失执行作业的sqoop元数据。

在EMR中,我们可以使用Bootstrap Action在集群创建中自动执行此操作。

2

作为每Sqoop docs

如果一个增量导入从命令行运行,这应该在随后的增量导入被指定为--last值的值将被显示在屏幕上供你参考。如果从保存的作业运行增量导入,则此值将保留在保存的作业中。后续运行的sqoop作业--exec someIncrementalJob将继续只导入比之前导入的行更新的行。

所以,你需要什么都不存储。 Sqoop的metastore将负责节省最后的价值,并为下一次增量导入工作提供帮助。

例,

sqoop job \ 
--create new_job \ 
-- \ 
import \ 
--connect jdbc:mysql://localhost/testdb \ 
--username xxxx \ 
--password xxxx \ 
--table employee \ 
--incremental append \ 
--check-column id \ 
--last-value 0 

,启动这个工作与--exec参数:

sqoop job --exec new_job 
+0

是的,问题是因为Metastore是保存在本地,有时我需要关闭ETL过程,当恢复时我需要从最后一个id重新启动。阅读文档,我看到了sqoop-metastore,并更改了sqoop站点。xml将这些属性远程保存在MySQL实例中。我明天会验证这种方法。 –

+0

@CarlosEduardo this _(远程MySQL作为metastore)_将解决您的问题。 –

+0

@CarlosEduardo你试过了吗? –