sqoop 增量最后修改与合并键

Dee*_*ner 1 sqoop

我正在尝试将更新的记录导入 HDFS 中。早些时候,我在 HDFS 中有三个部分的文件。当我运行下面的工具时,它给出了需要合并密钥的错误。

sqoop import --table employee --username training --password training --connect jdbc:mysql://localhost/loudacre --incremental lastmodified --check-column modified --last-value '2016-08-22 19:02:41'

但是,当我使用合并键选项时,我只能看到包含所有记录的部分文件。

小智 6

虽然是一篇很老的帖子,但我正在为有同样问题的人添加要点。

@Deepak_Spark_Beginner:如果错误显示“需要合并密钥”,则意味着“--target-dir”已经存在。由于您没有在 Sqoop 命令中指定此值,因此将选择默认值,即表名“employee”。这意味着,名为员工的目录已经存在。

接下来,当您在增量方法期间指定合并键时,会发生以下操作序列,

  1. 所有满足最后一个值条件的行都将导入到临时位置。此执行仅运行映射作业。这可以在日志中看到如下

8/10/30 13:27:52 INFO mapreduce.Job:映射 0% 减少 0%

18/10/30 13:27:58 INFO mapreduce.Job:映射 67% 减少 0%

18/10/30 13:27:59 INFO mapreduce.Job:映射 100%减少 0%

  1. 接下来,在原始目标目录“employee”和临时目标目录之间进行合并操作,其中 --merge-key 中指定的列用于更新现有数据。这会运行映射器和减速器,可以在日志中看到如下

18/10/30 13:28:08 INFO mapreduce.Job:映射 0% 减少 0%

18/10/30 13:28:14 INFO mapreduce.Job:映射 17% 减少 0%

18/10/30 13:28:16 INFO mapreduce.Job:映射 100% 减少 0%

18/10/30 13:28:20 INFO mapreduce.Job:映射 100%减少 100%

由于关键匹配必须扫描完整数据集的明显原因,需要减速器作业。另外,您可以通过文件名来验证相同的内容,其中包含一个表示减速器输出的“r”。

这就是为什么您在输出中只看到 1 个文件的原因。

你评论说“我的意思只是从数据库获取修改后的字段并使用lastmodified更新HDFS”。嗯,这就是发生的事情。如果检查输出,就会发现执行已从数据库获取修改后的字段并在 HDFS 中更新。唯一的区别是输出被合并到一个文件中。