我在AWS EMR中运行了很多sqoop作业,但有时我需要关闭此实例。
有一种方法可以从增量导入中保存最后一个ID,可能是localy并通过cronjob将其上传到s3。
我的第一个想法是,当我创建作业时,我只是向Redshift发送请求,我的数据存储在那里,并通过bash脚本获取最后一个id或last_modified。
另一个想法是获取sqoop作业的输出--show $ jobid,过滤last_id的参数并使用它再次创建作业。
但我不知道sqoop是否提供了一种更容易实现这一目标的方法。
答案 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。
创建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');
更改原始的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在群集创建中自动执行此操作。