数据处理架构演进
传统批处理架构
传统批处理架构,通常指离线数仓架构。数据源通过离线方式 ETL 到数仓,下游根据业务需求直接读取 DM 层数据或加一层数据服务。数据仓库从模型层分为三层:
● ODS:操作数据层,保存原始数据;
● DWD:数据仓库明细层,根据主题定义好事实与维度表,保存最细粒度的事实数据;
● DM:数据集市/轻度汇总层,在 DWD 层的基础之上根据不同的业务需求做轻度汇总;
Lambda 架构
Lambda 架构增强了传统的批处理架构,其“快速层”(Speed Layer)由低延迟的流处理器来支持。数据到达之后同时由批处理将写入批处理存储,流处理进行实时计算。流处理器近乎实时地计算近似结果并将它们写入“快速表”(Speed Table)。批处理器定期处理批量存储中的数据,将准确的结果写入批处理表,并从快速表中删除相应的不准确结果。应用程序会合并快速表中的近似结果和批处理表中的准确结果,然后消费最终的结果。
Kappa 架构
Kappa 架构是由LickedIn 的 Jay Kreps 提出的,可以认为是 Lambda 架构的简化版,完全依赖流处理器进行 ETL,在 Kappa 架构中,即使流处理引擎再健壮,由于上游数据原因,仍然存在数据重新处理的需求。修改数据或历史数 据重新处理都通过上游重放完成(从数据源拉取数据重新计算⼀次)。
Kappa 架构最⼤的问题是流式重新处理历史数据的吞吐能⼒会低于批处理,但这个可以通过增加计算资源来弥补。
Flink 简介
Flink 是一个能够对有界和无界流数据进行有状态计算的分布式流处理框架,它被设计在所有常见的集群环境中运行,以内存执行速度和任意规模来执行计算。
批处理与流处理到有界与无界
通常我们将数据处理方式分为批处理和流处理,这暗示了具体的计算引擎的选择。事实上,我们可以通过不断运行批处理程序用以处理流式数据,也可以用流处理程序很自然地处理一个批次的有限数据。
因此真正的区别是输入数据是有界还是无界。并且最终我们会发现,有界数据是无界数据的一个特例。
状态
对于一个无限的数据流,如果我们不希望频繁的每接收到一个事件就与外部系统交互一次将数据记录,那么我们的程序就需要时有状态的,这也就意味着我们的程序能够存储和访问中间数据。原则上我们可以将中间数据存储在任意位置,包括程序变量(内存)、本地文件,还有嵌入式或外部数据库。但是这样带来了一个新的问题,如果程序在运行过程中故障那么存储的中间数据就全丢失了,这将带来数据一致性问题,而 Flink 在这个方面就提供了很好的支持。
Flink 将运用程序的状态存储中内存或内嵌式的数据中,如 RocksDB。通过定期将应用程序状态的一致性检查点(Checkpoint)写入远程且持久化存储来保证这一点,这也就意味着可以对数据进行重放。
参考
https://flink.apache.org/flink-architecture.html
https://cloud.google.com/dataflow/
https://blog.youkuaiyun.com/u013516966/article/details/122787456
https://developer.aliyun.com/article/979525