我已经构建了一个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被错误地更新,导致我的数据重复的原因。这是我的监控:
如您所见,max_ID在实验的不同时间与sqoop_last_value不匹配。我得出结论,在使用Oozie时,执行sqoop作业后,sqoop incremenatal.last.value会被错误地更新。 有人遇到同样的问题吗?如果有,你找到任何解决办法吗?
谢谢,
答案 0 :(得分:1)
问自己一个问题: Sqoop在哪里存储"最后一个值"信息吗
答案是:对于Sqoop1,默认情况下,在本地文件系统上的文件中。但是Oozie在随机机器上运行你的Sqoop作业,因此执行不协调。
并且Sqoop2(具有适当的Metastore数据库)或多或少处于不确定状态;至少Oozie不支持。
解决方案是启动共享HSQLDB数据库服务来存储"最后一个值"所有Sqoop1作业的信息,无论他们运行什么机器。
请阅读Sqoop1文件,了解其跛脚Metastore以及如何使用它,从there到there。
要更专业地处理过时的HSQLDB数据库,请查看我的that post。