文章实时采集(实时数仓的开发模式与离线分层的处理逻辑(组图))
优采云 发布时间: 2022-04-04 18:00文章实时采集(实时数仓的开发模式与离线分层的处理逻辑(组图))
1. 早期实时计算
实时计算虽然是近几年才流行起来,早期有一些公司有实时计算的需求,但是数据量比较小,实时无法形成完整的系统,而且基本上都是发展是具体问题的具体分析。,来个要求做一个,基本不考虑它们之间的关系,开发形式如下:
如上图所示,拿到数据源后,会通过Flink进行数据清洗、维度扩展、业务逻辑处理,最后直接进行业务输出。拆开这个环节,数据源会重复引用同一个数据源,清洗、过滤、扩维等操作必须重复进行。唯一不同的是业务的代码逻辑不同。
随着产品和业务人员对实时数据的需求不断增加,这种开发模式也出现了越来越多的问题:
数据指标越来越多,“烟囱式”开发导致严重的代码耦合问题。
需求越来越多,有的需要详细的数据,有的需要OLAP分析。单一的开发模式难以应对多种需求。
资源必须针对每个需求进行申请,导致资源成本快速膨胀,资源无法集约有效利用。
缺乏复杂的监控系统来在问题影响业务之前检测和修复问题。
从实时数仓的发展和问题来看,它与离线数仓非常相似。后期数据量大之后,出现了各种问题。当时离线数仓是如何解决的?离线数仓通过分层架构将数据解耦,多个业务可以共享数据。实时数据仓库也可以使用分层架构吗?当然可以,但是细节和离线分层还是有一些区别的,后面会讲到。
2. 实时仓库搭建
在方法论方面,实时和离线非常相似。在离线数仓的前期,也详细分析了具体问题。当数据规模增长到一定数量时,将考虑如何管理它。分层是一种非常有效的数据治理方式,所以在谈到如何管理实时数仓时,首先要考虑的是分层的处理逻辑。
实时数据仓库的架构如下:
从上图中,我们详细分析每一层的作用:
我们可以看到,实时数仓和离线数仓的层级非常相似,比如数据源层、明细层、汇总层,甚至应用层,它们的命名模式可能是相同的。但不难发现,两者有很多不同之处:
3. Lambda架构的实时数仓
Lambda 和 Kappa 架构的概念在上一篇文章中已经解释过了。不明白的可以点击链接:一篇了解大数据实时计算的文章
下图展示了基于 Flink 和 Kafka 的 Lambda 架构的具体实践。上层为实时计算,下层为离线计算,横向以计算引擎划分,纵向以实时数仓划分:
Lambda架构是比较经典的架构。过去实时场景不多,主要是线下。加入实时场景后,由于离线和实时的时效性不同,技术生态也不同。Lambda架构相当于附加了一个实时生产环节,在应用层面集成,双向生产,各自独立。这也是在业务应用程序中使用它的一种合乎逻辑的方式。
双通道生产会出现一些问题,比如双处理逻辑、双开发和运维,资源也将成为两个资源环节。由于上述问题,演变出一种 Kappa 架构。
4. Kappa架构的实时数仓
Kappa架构相当于去掉了离线计算部分的Lambda架构,如下图所示:
Kappa架构在架构设计方面比较简单,在生产上是统一的,有一套离线和实时生产的逻辑。但是在实际应用场景中存在比较大的局限性,因为同一张表的实时数据会以不同的方式存储,导致关联时需要跨数据源,对数据的操作有很大的局限性,所以它直接在行业中。用Kappa架构制作和落地的案例很少,场景比较简单。
关于Kappa架构,熟悉实时数仓制作的同学可能会有疑问。因为我们经常面临业务变化,很多业务逻辑需要迭代。如果之前产生的一些数据的口径发生了变化,就需要重新计算,甚至历史数据都会被改写。对于实时数仓,如何解决数据重新计算的问题?
这部分Kappa架构的思路是:首先准备一个可以存储历史数据的消息队列,比如Kafka,这个消息队列可以支持你从某个历史节点重启消费。那么就需要启动一个新任务,从更早的时间节点消费Kafka上的数据,然后当新任务的进度可以和当前正在运行的任务相等时,就可以将任务的下游切换到新任务,可以停止旧任务,也可以删除原来的结果表。
5. 流批结合的实时数仓
随着实时OLAP技术的发展,Doris、Presto等开源OLAP引擎的性能和易用性有了很大的提升。再加上数据湖技术的飞速发展,流和批的结合变得简单。
下图是结合流批的实时数仓:
数据从日志采集统一到消息队列,再到实时数仓。基础数据流的构建是统一的。之后,对于日志实时特性,实时大屏应用使用实时流计算。实时OLAP批处理用于Binlog业务分析。
我们看到,上述架构的流批组合方式和存储方式都发生了变化。卡夫卡被冰山取代。Iceberg是上层计算引擎和底层存储格式之间的中间层。我们可以把它定义成“数据组织格式”,而底层存储还是HDFS,那为什么还要加一个中间层,还不如把对流和批处理结合起来呢?Iceberg 的 ACID 能力可以简化整个流水线的设计,降低整个流水线的延迟,其修改和删除能力可以有效降低开销,提高效率。Iceberg可以有效支持批量高吞吐数据扫描和分区粒度的流计算并发实时处理。