使用带Oozie的sqoop观察重复项

时间:2016-05-27 09:46:01

标签: hadoop sqoop oozie

我已经构建了一个sqoop pogram,以便使用预先构建的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 '\"'

我还建立了一个火花程序,允许monnitore sqoop输入。在这里,我测量了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被错误地更新,导致我的数据重复的原因。这是我的监控:

enter image description here

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

谢谢,

1 个答案:

答案 0 :(得分:1)

问自己一个问题: Sqoop在哪里存储"最后一个值"信息吗

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

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

请阅读Sqoop1文件,了解其跛脚Metastore以及如何使用它,从therethere
要更专业地处理过时的HSQLDB数据库,请查看我的that post