使用带有 Oozie 的 sqoop 观察重复项

Posted

技术标签:

【中文标题】使用带有 Oozie 的 sqoop 观察重复项【英文标题】:Observing duplicates using sqoop with Oozie 【发布时间】:2016-05-27 09:46:00 【问题描述】:

我已经构建了一个 sqoop 程序,以便使用预先构建的 sqoop 作业将数据从 mysql 导入 HDFS:

                sqoop job -fs $driver_path -D mapreduce.map.java.opts=" -Duser.timezone=Europe/Paris"\
            --create job_parquet_table -- import -m $nodes_number\
            --connect jdbc:mysql://$server:$port/$database --username $username --password-file $pass_file\
            --target-dir $destination_dir --table $table --as-parquetfile --append\
            --incremental append --check-column $id_column_names --last-value 1\
            --fields-terminated-by , --escaped-by \\ --enclosed-by '\"'

我还建立了一个允许监控 sqoop 导入的 spark 程序。在此,我测量了正在导入的表的 max_id(SELECT Max(ID)、sqoop incremental.last.value、记录数(SELECT count())、不同记录数( SELECT count(distinct ID)) 和重复的百分比(定义为 SELECT count() - count(distinct ID) / count(*) * 100)。

当我手动导入数据时,通过执行 sqoop 作业:

sqoop-job --exec job_parquet_$table -- --username edastatnew --password edastatnew

一切正常,我没有重复,数据已完美导入

但是,当我使用 Oozie 安排 sqoop 作业时,我观察到 sqoopincremental.last.value 更新错误,这导致我的数据重复。这是我的监控:

如您所见,max_ID 在实验的不同时间与 sqoop_last_value 不匹配。我得出的结论是,在使用 Oozie 时,执行 sqoop 作业后错误地更新了 sqoop incremenatal.last.value。 有人遇到过同样的问题吗?如果有,你找到解决办法了吗?

谢谢,

【问题讨论】:

【参考方案1】:

问自己一个问题:Sqoop 将“最后值”信息存储在哪里?

答案是:对于 Sqoop1,默认情况下,在本地文件系统上的文件中。但 Oozie 在随机机器上运行您的 Sqoop 作业,因此执行不协调。 而 Sqoop2(它有一个合适的 Metastore 数据库)或多或少处于不确定状态;至少 Oozie 不支持它。

解决方案是启动一个共享 HSQLDB 数据库服务来存储所有 Sqoop1 作业的“最后值”信息,无论它们在什么机器上运行。

请阅读 Sqoop1 文档,了解它的蹩脚Metastore 以及如何使用它,从there 到there。 要更专业地处理那个过时的 HSQLDB 数据库,请查看我的 that post。

【讨论】:

以上是关于使用带有 Oozie 的 sqoop 观察重复项的主要内容,如果未能解决你的问题,请参考以下文章

Sqoop - 使用 Oozie 导入 Hive 失败

使用 Oozie 永久运行 Sqoop 作业

oozie调度sqoop脚本时操作符号替换

Oozie Sqoop 作业 - 无法恢复作业

oozie怎么找到sqoop在哪个节点上

oozie sqoop 操作导入失败