使用带有 Oozie 的 sqoop 观察重复项
Observing duplicates using sqoop with Oozie
我构建了一个 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 程序。在此,我测量了正在导入的 table 的 max_id (SELECT Max(ID),sqoop incremental.last.value,记录数 ( SELECT count()),不同记录的数量 (SELECT count(distinct ID)) 和重复的百分比(定义为 SELECT count() - 计数(不同 ID)/计数(*)* 100)。
当我手动导入数据时,通过执行 sqoop 作业:
sqoop-job --exec job_parquet_$table -- --username edastatnew --password edastatnew
一切正常,没有重复,数据完美导入
但是,当我使用 Oozie 安排 sqoop 作业时,我观察到 sqoopincremental.last.value 被错误更新,导致我的数据重复。这是我的监控:
如您所见,max_ID 在实验的不同时间与 sqoop_last_value 不匹配。我得出的结论是,在使用 Oozie 时,sqoop incremenatal.last.value 在执行 sqoop 作业后被错误更新。
有人遇到过同样的问题吗?如果是的话,你找到解决办法了吗?
谢谢,
问自己一个问题:Sqoop 将 "last value" 信息存储在哪里?
答案是:对于 Sqoop1,默认情况下,在 本地文件系统 上的一个文件中。但是 Oozie 在 随机机器 上运行您的 Sqoop 作业,因此执行不协调。
而 Sqoop2(它有一个合适的 Metastore 数据库)或多或少处于不确定状态;至少Oozie不支持它。
解决方案是启动一个 共享 HSQLDB 数据库服务 来存储所有 Sqoop1 作业的 "last value" 信息,无论它们 运行 在什么机器上。
请阅读 Sqoop1 文档了解它的蹩脚 Metastore and about how to use it, from there to there。
要更专业地处理过时的 HSQLDB 数据库,请查看我的 。
我构建了一个 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 程序。在此,我测量了正在导入的 table 的 max_id (SELECT Max(ID),sqoop incremental.last.value,记录数 ( SELECT count()),不同记录的数量 (SELECT count(distinct ID)) 和重复的百分比(定义为 SELECT count() - 计数(不同 ID)/计数(*)* 100)。
当我手动导入数据时,通过执行 sqoop 作业:
sqoop-job --exec job_parquet_$table -- --username edastatnew --password edastatnew
一切正常,没有重复,数据完美导入
但是,当我使用 Oozie 安排 sqoop 作业时,我观察到 sqoopincremental.last.value 被错误更新,导致我的数据重复。这是我的监控:
如您所见,max_ID 在实验的不同时间与 sqoop_last_value 不匹配。我得出的结论是,在使用 Oozie 时,sqoop incremenatal.last.value 在执行 sqoop 作业后被错误更新。 有人遇到过同样的问题吗?如果是的话,你找到解决办法了吗?
谢谢,
问自己一个问题:Sqoop 将 "last value" 信息存储在哪里?
答案是:对于 Sqoop1,默认情况下,在 本地文件系统 上的一个文件中。但是 Oozie 在 随机机器 上运行您的 Sqoop 作业,因此执行不协调。
而 Sqoop2(它有一个合适的 Metastore 数据库)或多或少处于不确定状态;至少Oozie不支持它。
解决方案是启动一个 共享 HSQLDB 数据库服务 来存储所有 Sqoop1 作业的 "last value" 信息,无论它们 运行 在什么机器上。
请阅读 Sqoop1 文档了解它的蹩脚 Metastore and about how to use it, from there to there。
要更专业地处理过时的 HSQLDB 数据库,请查看我的