实时数仓中数据实时接入的实现思考

搭建实时数仓架构过程中,能否实现数仓的真正实时,取决于数仓架构是否能够支持以下三个方面:

  1. 数据实时接入
  2. 数据实时计算
  3. 数据实时输出

这三个方面是有顺序的,数据接入到数仓,然后计算,最后将计算指标结果输出。实现方式可以是三步,也可以是两步,或者一步到位,具体取决于架构中的技术选型,和架构师的解耦习惯。

举例:对于源库为Mysql的数仓,可以使用Flink CDC实时采集Mysql增量数据,并使用Flink算子实时计算,最后将指标计算结果输出到ADS表,整个过程在Flink程序中实现,一步到位;也可以使用CDC工具(Flink CDC或者Debezium或者canal等等)将mysql增量数据采集到kafka中,然后使用ETL工具(Flink或者Streamsets或者NiFi)消费kafka中的数据,并实时计算,最后将指标计算结果输出到ADS表,这个思路使用解耦的方法,将数据接入和数据计算通过kafka解耦了,笔者采用的就是这种思路。

对于技术选型,我们姑且分为Flink技术栈和非Flink技术栈两种类型:

  • Flink技术栈:采用Flink/Spark流处理工具实现实时数仓的接入、计算和输出。
  • 非Flink技术栈:采用ETL工具(NiFi)实现实时数仓的接入、计算和输出。

两种技术栈孰优孰劣,这里不讨论。至于如何选择,可以从以下几点考虑:

  • 是否与项目组中的技术人员的技术栈匹配?如果项目成员对Flink很熟悉,那就选择Flink技术栈,反之亦然;
  • 人员配置是否容易到位?如果招聘Flink开发/运维人员很容易,成本也是能负担起的,那就选择Flink技术栈,如果招聘ETL开发人员很容易,那就选非Flink技术栈。

仅仅招聘ETL开发人员,真的可以实现数仓指标计算的实时性吗?是的。笔者采用的就是这种方式。采用的技术栈为Debezium+Kafka+NiFi+Doris。本文将最近落地实现的数据实时接入、实时计算两个方面分享出来,供大家讨论。

这里假设有一个前提:源库增量数据已经在kafka中了。做到这一点,可以用Debezium工具。下一步,要做的就是基于kafka中的增量数据做实时计算,实时计算有两种数据流向:

  • 从kafka中获取增量数据,在NiFI中直接计算,结果输出到ADS。这种方式可以达到毫秒级延迟,但是有前提条件,对这部分感兴趣的朋友可以加笔者微信详聊;
  • 从kafka中获取增量数据,实时写入Doris,然后运行ETL任务计算当天的增量数据,结果输出到ADS。这种方式的延迟在30秒到几分钟之间。

将kafka中的增量CDC数据接入到Doris或者Kudu中,难点在于顺序的保证上。因为CDC数据包括记录的增删改日志,如果不按原始顺序写入到目标表,就会造成目标表数据与原始表数据不一致的结果。我们知道,如果要保证顺序,就会影响吞吐量,造成写入速度降低,进而延迟增加,要实现实时数仓,这个矛盾点必须解决。

实时接入CDC数据到Doris或者kudu中的实现方式,笔者已将整个过程形成了公众号系列文章《实时数仓哪些事儿》,这里不再赘述。

随着公司业务量的增加,数据增量也在增加,文章中的方式已无法满足实时性要求了,于是,笔者对接入过程进行了优化,性能提升了10倍以上,从几百条/秒的CDC数据接入速度,增加到了几千条/秒的CDC数据接入速度。

实现这一点,主要是从按序单条处理,改成了批量处理。你可能会有疑问:批量处理,怎么保证顺序呢?不保证顺序,结果不一致怎么办?首先,从kafka中拿到的CDC增量数据,无论是增删改,整体还是有顺序的,这里的一点改动是:如果我拿到了一张表的100条CDC增量数据,里面有增加日志、修改日志、删除日志,或者只有其中一种或者两种日志。那么先执行这100条CDC增量数据的所有增加日志(批量),将数据批量插入到目标表,再执行所有修改日志(批量),批量修改目标表,最后执行所有的删除日志,批量删除目标表记录,即:按顺序执行批量新增SQL、批量修改SQL、批量删除SQL,最终结果和按序单条执行的结果是一样的,和源表是一致的,但这种方式,使吞吐量提升了,毕竟批量执行的速度远远大于单条执行的速度。

实现上述思路的方法有很多,大家可以基于自有数仓技术栈来实现,提升数仓的实时性。如果有更好的思路,欢迎讨论。

对于上述思路,笔者基于NiFi工具,做了实现。使用NiFI中的相关组件,消费kafka中的数据,生成批量SQL,然后在Doris和Impala Kudu表上执行。整个实现过程相对简单,扩展性强,详细步骤已形成视频,需要的朋友可以联系笔者获取。

笔者的数仓架构基于Debezium+Kafka+NiFi+Doris技术栈,经过各种采坑,各种优化,实现了数据实时接入,数据实时计算和数据实时输出的流批一体的实时数仓架构,整个实现过程,笔者正在整理视频,欢迎大家关注公众号 登峰大数据,一起探讨流批一体的实时数仓架构。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

登峰大数据

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值