数仓之数据集成

前两节我们简单讲述了数仓的作用、一个基本数仓的应用架构,这小节我们继续讲解下数仓的数据集成。

数据集成指的是将企业内所有具有分析价值的数据同步到数据仓库中做集成管理,所以基础功能是数据同步。前面我们讲到数据同步可以是应用端自动上报到数仓的采集服务,例如ToC业务常见的前端js埋点发送数据到nginx,这是推的方式。还有通过jdbc直接拉取业务库表或者接口这是拉取的方式。埋点需要投入专门的开发工作量,而且埋点往往是需要更细粒度的获取用户操作信息,不是一般的数据同步方法。访问库表拉取数据则首先需要业务系统的时间字段才能做到增量同步,一旦业务库表的时间字段不准确或者不存在又或者业务库表存在物理删除都会导致数据无法准确的增量同步及额外的有侵入性的开发成本,而且大量的拉取业务表数据也会增加业务库的性能压力。这个时候另一种技术脱颖而出----变更数据捕获技术CDC(change data capture)。它的原理是伪装自己为一个数据库从节点,从而订阅业务系统的数据库变更日志,例如mysql的binlog日志。数据库自身的同步机制也是基于该日志进行同步的,当然这里需要明确的是只有逻辑复制才能支持CDC,例如binlog的ROW模式,postgresql的逻辑复制槽等。CDC技术可以订阅源端库表的IUD动作,然后用户根据自己的需求将变更动作同步到数仓库表以达到增量同步数据的效果,这种方式另一个好处是变化是实时推送的,延时为毫秒级,这个方案也为实时数仓提供良好的基石。

对于拉取库表的同步方式是最常用的手段,一般我们对数据量小的维度表可以采取定时全量同步的方案,因为全量拉取成本很低没必要再开发增量同步脚本。对于大的流水表就得根据库表的更新时间,每天增量同步前一天的数据,当然增量之前需要先初始化历史数据到数仓。如果是根据业务库表的业务时间进行增量订阅,那就得特别注意了,很多时候业务时间是和现实时间不一致的,比如今天拉取昨天的100条数据,然后今天新增了一条数据业务时间是昨天的,那明天再同步这条数据就无法被拉取到,从导致数据丢失。那基于系统时间增量同步就没有问题了吗,在系统时间字段维护正常的情况下。很多时候会遇到一种场景,即今天同步的数据的业务时间是好几天前的,这会对下游分析数据产生一定影响,分析人员会感觉到历史数据在变化,可能会觉得数据有问题。对于删除数据的同步方式可以采用逻辑删除的方式支持,但是如果业务系统没有统一的使用逻辑删除方案则只因为分析部门的需求去改变物理删除为逻辑删除基本上是不现实的。最后对于jdbc的批同步工具这里推荐一个开源工具datax,它是阿里开源的异构数据源同步工具,支持RDBMS关系型数据库、NoSql数据库、非结构化数据源、时序数据库的读取及写入,速度方面号称可以打满网卡,实际上往往受限于读库或者写库的性能,不过同步速度一般能在几兆每秒,足够一般使用。如果使用的是大数据组件,那一般使用的为配套的Sqoop工具,这里不做赘述。

说回CDC技术,这里简单介绍下相关的开源组件。专注于mysql的canal是阿里开源的项目,canal只支持同步mysql的binlog日志数据,当然该组件足够成熟,不仅支持DCL语句同步还支持DDL语句监控。同时它还提供的客户端消费同步的变更数据写入ES、HBASE、支持jdbc的关系型数据库中,还提供的管理组件进行服务运维管理。另外订阅的binlog日志数据是可以推送到mq和kafka消息队列组件中的。总之如果你的公司业务系统只使用mysql数据库那么使用cana捕获数据变更动作是一个不错的选择。

另一个开源组件是最近火起来的flink cdc组件,它同样是阿里开源的项目。区别于canal的纯java服务程序,flink cdc如字面意思是依赖于flink组件所开发的一种source源。他的优点在于开发简单,支持初始化。基于flink sql,只要配置好sql直接执行就生成了一个源端到目标端的flink任务,该任务会先初始化源端库表数据然后无缝的从binlog日志同步到目标端库表中。在最新版本中初始化动作也不再需要短暂锁表同时支持并行同步加快初始化速度,而canal是不支持初始化的只能手动等将历史数据化初始化到数仓再跟进canal订阅binlog。另外flink cdc目前已经支持mysql、oracle、potgresql等多种数据库。这样看来flink cdc不是完爆canal吗,其实不然flink cdc目前无法支持DDL,这侧面导致了它无法支持源端库表结构变更,一旦变更就需要重新初始化不然结构不一致会导致数据订阅异常,同时目前不常更新的库表的binlog偏移量不随着binlog整体日志的滚动而滚动,这意味着长时间不更新数据的表source端存储的偏移量对应的binlog日志可能已经被数据库清理掉了。

最后再简单介绍下Debezime,它也是类似canal这种独立运行的java组件,同时前面提到的flink cdc内部也是基于该组件做得日志订阅,感兴趣的小伙伴也可以去官网上看下,它也支持多种常用的数据库,这里笔者没有深入使用过就不做过多介绍。

数据集成出去数据同步这种职责单一的方式还有集成化的开源方案,这里介绍下apache inlog国产apache顶级开源项目大家感兴趣的话可以了解下。

总结:本小结我们简单介绍了数据集成的几个基础方案,即埋点、数据拉取、CDC三类,大家可以根据自己公司的需求及技术栈进行选择。另外集成化方案也是基于这三类方法在数据数据同步功能的基础上增加了数据集中缓存、数据脱敏、数据清洗、数据计算等等功能,做到集成一站化。

你可能感兴趣的:(数据仓库,大数据,数据仓库,flink)