sqoop是可以配置job自动运行的,能自动记录上次同步的时间,不过如果任务失败就不方便重跑了(这方面经验不足)。
目前的做法是手动去配置一个固定的同步周期和--last-modify值,这样一来就可能有数据重复的问题(比如数据漂移、或者任务失败重跑需要一个保险的覆盖范围)。
解决思路大致是在同步时先允许数据重复,之后再跑一个去重sql,比如:
sqoop增量导入问题
不过这样做太不优雅,因为这样操作会多出一张没有实际意义的增量表。
这里增量导入的做法差不多,只是增量到同一张表里,注意需要添加--hive-database以及--hive-table选项让新数据能自动load到hive表里,标准解释如下:
Difference between --append and --incremental append in sqoop
之后使用窗口函数sql去重处理
INSERT OVERWRITE TABLE db_name.tb_name
select
tmp.id,
tmp.modify_time
from
(
select t.*,
row_number() over(partition by t.id order by t.modify_time desc) as rn
from
(select
id,modify_time from db_name.tb_name
) t
) tmp where tmp.rn=1;
当然这样要求原表有主键以及准确非空的修改时间,如果没有还是用真正的流式数据同步来做吧(maxwell解析binlog->kafka->flume->hive)
Done.
网友评论