【问题标题】:Save sqoop incremental import id保存 sqoop 增量导入 id
【发布时间】:2016-08-27 05:06:45
【问题描述】:

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

有一种方法可以保存增量导入的最后一个 id,可能是本地化,然后通过 cronjob 将其上传到 s3。

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

另一种思路是获取sqoop job的输出--show $jobid,过滤last_id的参数,再用它来创建job。

但我不知道 sqoop 是否提供了一种更容易做到这一点的方法。

【问题讨论】:

    标签: bash sqoop


    【解决方案1】:

    根据 Sqoop docs

    如果从命令行运行增量导入,则应在后续增量导入中指定为 --last-value 的值将打印到屏幕上供您参考。如果从已保存的作业运行增量导入,则此值将保留在已保存的作业中。 sqoop 作业的后续运行 --exec someIncrementalJob 将继续只导入比之前导入的行更新的行。

    因此,您无需存储任何内容。 Sqoop 的元存储将负责保存最后一个值并用于下一个增量导入作业。

    例子,

    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
    

    【讨论】:

    • 是的,问题是因为 metastore 保存在本地,有时我需要关闭 ETL 进程,在恢复时我需要从最后一个 id 重新启动。阅读文档后,我看到了 sqoop-metastore,并更改了 sqoop-site.xml 以将这些属性远程保存在 MySQL 实例中。我明天将验证这种方法。
    • @CarlosEduardo this (remote MySQL as metastore) 会解决你的问题。
    【解决方案2】:

    解决方案

    我更改文件 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 在集群创建中自动执行此操作。

    【讨论】:

      猜你喜欢
      • 2016-03-27
      • 2015-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-17
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      相关资源
      最近更新 更多