Bash 保存sqoop增量导入id

Bash 保存sqoop增量导入id,bash,sqoop,Bash,Sqoop,我在AWS EMR中运行了很多sqoop作业,但有时我需要关闭这个实例 有一种方法可以保存增量导入的最后一个id,可能是localy,然后通过cronjob将其上传到s3 我的第一个想法是,当我创建作业时,我只需向Redshift发送一个请求,在那里存储我的数据,并通过bash脚本获得最后一个id或最后一个被修改的 另一个想法是获取sqoop作业的输出——show$jobid,过滤last_id的参数,并使用它再次创建作业 但我不知道sqoop是否提供了一种更容易做到这一点的方法。根据sqoop

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

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

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

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

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

根据sqoop

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

如果从命令行运行增量导入,则在后续增量导入中应指定为--last值的值将打印到屏幕上供您参考。如果从保存的作业运行增量导入,则此值将保留在保存的作业中。sqoop job--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
解决方案 我更改了文件sqoop-site.xml,并将端点添加到MySQL中

台阶
  • 创建MySQL实例并运行以下查询:
    CREATE TABLE SQOOP_ROOT(version INT,propname VARCHAR(128)NOT NULL,propval VARCHAR(256),CONSTRAINT SQOOP_ROOT_unq UNIQUE(version,propname))
    插入到SQOOP_根值中(NULL,'SQOOP.hsqldb.job.storage.version','0')

  • 更改原始的sqoop-site.xml,添加MySQL端点、用户和密码

  • 
    sqoop.metastore.client.enable.autoconnect
    真的
    如果为true,Sqoop将连接到本地元存储
    在没有其他元存储参数时用于作业管理
    假如
    sqoop.metastore.client.autoconnect.url
    jdbc:mysql://your-mysql-instance-endpoint:3306/database
    连接到服务器时要使用的连接字符串
    作业管理元存储。如果未指定,则使用~/.sqoop/。
    您可以在此处指定其他路径。
    sqoop.metastore.client.autoconnect.username
    ${sqoop user}
    要绑定到元存储的用户名。
    sqoop.metastore.client.autoconnect.password
    ${sqoop pass}
    绑定到元存储的密码。
    
    当您第一次执行命令
    sqoop job--list
    时,它将返回零值。但是在创建作业之后,如果关闭EMR,执行作业时不会丢失sqoop元数据

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

    解决方案 我更改了文件sqoop-site.xml,并将端点添加到MySQL中

    台阶
  • 创建MySQL实例并运行以下查询:
    CREATE TABLE SQOOP_ROOT(version INT,propname VARCHAR(128)NOT NULL,propval VARCHAR(256),CONSTRAINT SQOOP_ROOT_unq UNIQUE(version,propname))
    插入到SQOOP_根值中(NULL,'SQOOP.hsqldb.job.storage.version','0')

  • 更改原始的sqoop-site.xml,添加MySQL端点、用户和密码

  • 
    sqoop.metastore.client.enable.autoconnect
    真的
    如果为true,Sqoop将连接到本地元存储
    在没有其他元存储参数时用于作业管理
    假如
    sqoop.metastore.client.autoconnect.url
    jdbc:mysql://your-mysql-instance-endpoint:3306/database
    连接到服务器时要使用的连接字符串
    作业管理元存储。如果未指定,则使用~/.sqoop/。
    您可以在此处指定其他路径。
    sqoop.metastore.client.autoconnect.username
    ${sqoop user}
    要绑定到元存储的用户名。
    sqoop.metastore.client.autoconnect.password
    ${sqoop pass}
    绑定到元存储的密码。
    
    当您第一次执行命令
    sqoop job--list
    时,它将返回零值。但是在创建作业之后,如果关闭EMR,执行作业时不会丢失sqoop元数据


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

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