数仓的基础是数据,没有数据,那么数仓就是一个空壳,数据的来源有很多,我们需要按照一个规则和流程来制定采集方案,还要根据数据的特性和用途选取合适的采集程序,数据的采集我们一般分为全量和增量,对于一些业务场景,也需要二者配合使用。
全量就是一次性将所有数据都采集过来,比如按照天数/月数来进行,如果数据量很大,那么可能就会比较耗时,而且也会占用很大的存储空间,比如我们每天需要同步MySQL中的数据,如果每天都全部同步过来,那么就会存在大量的重复数据,因为MySQL那边每天都在原有的基础上增加数据,而每天都全量同步一份过来,所以就是冗余的数据,而且它不是实时的,需要在每天的一个时间点进行同步,它的好处就是数据比较完整,但是会占用大量的存储。
因为每天都全量同步数据过来,会占用大量的存储空间,效率也不高,所以一般采用增量同步,不过增量是建立在全量的基础之上,所以需要一次全量同步,后续再增量同步,增量就是数据会增加或者修改,所以在同步的时候难度就会比较大,如果不借助工具,那么就需要根据时间戳来进行同步,比如添加一个create_time字段和update_time字段,添加数据的时候会设置当前的时间,修改数据的时候更新修改时间,再以当天日期为条件去获取符合条件的数据,不过有一个问题,数据没有那么实时,因为要主动去获取数据,会由于网络等原因导致不实时,对数据库的压力也比较大,所以我们需要另外一种方式,那就是CDC。
CDC叫做变化数据捕获(Change Data Capture), 是指识别和捕获对数据库中的数据的变化,如修改,删除,添加,然后将这些变化通过某种方式记录下来,并通过一定的机制传递到下游服务,通过这种机制,能够减轻数据库的压力,数据的实时性更高,比如MySQL的binglog机制就是CDC。
数据采集工具分为全量采集和增量采集。
全量采集工具有很多,比如Sqoop,kettle,DataX,我们主要来说一下DataX,DataX可实现各种数据之间的转换,如果DataX自带的数据源满足不了我们的需求,也可以自己去实现,DataX由一个Writer和一个Reader组成,Reader是数据提供方,Writer是数据需求方,比如mysqlreader,doriswriter,就是将mysql的数据同步到doris。
DataX只需要简单的安装,安装后只需要编写一个json转换文件,然后执行json脚本即可,执行脚本后就开始了数据的同步,不过我们的同步任务可能是每天执行一次,如果任务特别多,那么每天去执行脚本的话就会变得麻烦,那么可以使用定时任务,linux可以使用crond进行定时调度,但是使用cronb的话无法监测任务的成功或者失败,也不能对任务进行统计,所以我们需要一个统一任务调度平台,比如Azkaban,DepinSchudeler等,后续我们会使用它。
对于增量同步,我们需要用到CDC工具,如Flume可以采集日志,canal可以实时同步mysql数据到其他中间件,还有Maxwell,Debezium,Flink中也有一个组件flink cdc,我们可以根据业务需求去选择,下面我们来说一下flink cdc。
在传统的cdc架构中,我们一般先通过cdc工具将数据写入到kafka中,然后通过flink或者spark读取kafka的数据进行流式处理后写入到数仓中,如下所示。
而使用flink cdc后,整个链路就会变得很短,省去了中间的Debezium,kafka和流式处理,flink cdc一步到位,flink cdc的底层采集工具也是基于Debezium实现,如下所示。
flink cdc支持多种数据数据连接器,可以说我们许需要写一行代码,只需要会写sql,并且作一些简单的配置,便可以实现数据的增量同步,它的本质其实就和flink的source和sink一样,source是数据来源,sink是同步到对应的目标数据源,知识我们使用flink的话需要加入一些中间件和编写代码,使用flink cdc就简单得多,只需要编写sql,就可以实现数据的连接,统计等。
❝今天的分享就到这里,感谢你的观看,我们下期见,如果本文有描述不正确或不合理的地方,还请你提出宝贵的意见,我们一起在学习中成长,进步!