强大的Flink,流/批/OLAP 一体

104 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的的第2天

Apache Flink is a framework and distributed processing engine for stateful computations over unbounded and bounded data streams. Flink has been designed to run in all common cluster environments, perform computations at in-memory speed and at any scale.
这是Apache Flink社区官网的介绍,集中体现了Flink的特点,本文将围绕这句话展开。
关于批处理,市面上已有很成熟的产品,如MapReduce、Spark等,而流处理相较于批处理对实时性有着更高的要求,在推荐算法、金融风险识别与防范、异常行为检测等领域有着广阔的应用前景。对比Storm、Spark Streaming、Flink在模型、一致性、延迟、吞吐、容错、stateful以及SQL支持上Flink均有着不错的表现,此外Flink社区有着丰富的生态应用,可以支撑Flink更好发展。
Flink架构可以分为四层:

  1. SDK层:Flink的SDK目前主要三类:SQL/Table、DataStream、Python;
  2. 执行引擎层:提供了统一的DAG,用以描述处理数据的Pipeline,无论流还是批都会转化为DAG图,调度层再将其转化为分布式环境下的Task,Task之间通过Shuffle传输数据;
  3. 状态存储层:负责存储算子的状态信息;
  4. 资源调度层:目前Flink可以支持部署在多种环境。

一个Flink集群,主要包含JM和TM这两个核心组件,JM(JobManager)负责整个任务的协调工作,包括调度task、触发协调task做Checkpoint、协调容错恢复等;TM(TaskManager)负责执行一个DataFlow Graph的各个task以及Data Streams的buffer和数据交换。
为了更高效地分布式执行,Flink会尽可能地将不同的操作链接在一起形成task,这样每个task可以在一个线程中执行。具体执行中会将task调度到TM的slot中执行,一个slot只能运行同一个task的subTask。
批计算是流式计算的特例,有界数据集也是一种特殊的数据流,因此理论上可以用一套引擎处理这两种计算。在最新的调度方式中,不管流作业还是批作业都是按照pipeline region粒度进行申请资源和任务调度。针对流和批,Flink还提供了两种类型的Shuffle分别处理。而OLAP是一种特殊的流式计算,只是对并发和实时性要求更高,需要针对性优化,因此可以用一套引擎解决三种场景。