有关数仓增量和全量同步的一些思考

1、背景

相信不少公司都是基于Hive作的数仓,从而对外提供数据服务。这里只讨论离线数仓,作数仓必然离不开对大量数据的ETL处理工做。目前的ETL种类繁多,可选择的工具也有不少,好比使用Sqoop, DataX作离线的T+1数据同步, Spark或者Flink作T+0的实时数据同步等。web

目前有不少公司业务是T+1的,天天须要同步昨天的业务库(MySQL、mongodb等)的数据到Hive数据仓库中,这里就涉及到大量数据同步的性能开销问题。我司因为历史缘由,大量的MySQL表是全量同步的,并且因为某些缘由竟然还不带时间字段好比:created_at,updated_at等,不过好在后面和DBA进行沟通补全了。咱们直到sqoop是支持全量和增量进行数据同步的 参考Sqoop抽数的模式sql

可是数仓更多的是基于分区来作的,虽然sqoop能够只同步修改的,可是咱们须要按天或者小时为维度得到天级和小时级全量数据,鉴于历史缘由,咱们并无作真正意义上的天级或者小时级分区而是使用每一个分区全量的方式提供服务。mongodb

2、注意事项

  1. 关于MySQL建表:
    必须有主键,必须有时间字段包含建立和修改,必须最小化使用字段类型,必须建立常常使用的字段索引,必须主从分离。
  2. 如下天级和小时级增量全量主要针对没有历史数据修改的状况。若是有历史修改,须要从新刷下全量数据,或者干脆就采用监听MySQL binglog日志作实时同步。

3、天级数据增量同步

思路: 天天将前天的全量数据和昨天的增量数据进行聚合(Union All)
这里须要依赖一个天级增量任务:ods_xxx_record_di,ods_xxx_record_df任务会将ods_xxx_record_di做为他的前置依赖,当ods_xxx_record_di任务运行完成后就开始使用hive或者sparksql计算svg