保存sqoop增量导入ID

时间:2016-08-24 00:44:56

标签: bash sqoop

我在AWS EMR中运行了很多sqoop作业,但有时我需要关闭此实例。

有一种方法可以从增量导入中保存最后一个ID,可能是localy并通过cronjob将其上传到s3。

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

另一个想法是获取sqoop作业的输出--show $ jobid,过滤last_id的参数并使用它再次创建作业。

但我不知道sqoop是否提供了一种更容易实现这一目标的方法。

2 个答案:

答案 0 :(得分:2)

根据Sqoop docs

  

如果从命令行运行增量导入,则在后续增量导入中应指定为--last-value的值将打印到屏幕上供您参考。如果从已保存的作业运行增量导入,则此值将保留在已保存的作业中。随后运行的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

答案 1 :(得分: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端点,用户和密码。

  3.   <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在群集创建中自动执行此操作。