Flink概述
为什么需要流式计算
批式计算:等待直到一批数据到齐才开始计算,以小时/天等周期对静态数据集进行离线计算,不具有实时性。
流式计算:对不断有新数据产生的动态数据集进行实时计算,并且7*24h持续运行。
由于有对数据的实时性要求更高的业务场景,如:实时推荐、监控等,原来的批式计算不足以满足这样的要求,所以我们需要流式计算。
Why Flink
Exactly-Once, Checkpoint, Dataflow, 流批一体
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.
Flink整体架构
Flink分层架构
1.SDK层:Flink的SDK目前主要有三类:SQL/Table, Datastream, Python
2.执行引擎层(Runtime层):执行引擎层提供了统一的DAG,用来描述数据处理的Pipeline,不管是流还是批,都会转化为DAG图,调度层再把DAG转化成分布式环境下的Task,Task之间通过suffle传输数据。
3.状态存储层:负责存储算子的状态信息。
4.资源调度层:目前Flink可以支持部署在多种环境。
(Flink分层架构图)
Flink整体架构
两个核心组件:
1.JobManager(JM):负责整个任务的调度工作。包括:调度Task、触发协调Task做CheckPoint、协调容错恢复等。
2.TaskManager(TM):负责执行一个DataFlow Graph的各个task以及data streams的buffer和数据交换。
(Flink集群的简单概念图)
JM又细分为三点:
1.Dispathcher:接受作业,拉起JM执行作业,并在JM挂掉后恢复作业。
2.JobMaster:管理一个job的整个生命周期,会向ResourceManager申请slot,并将Task调度到对应的TM上。每个TM上有一个或多个slot,每个slot都是一个单独的线程。
3.ResourceManager:负责slot资源的管理和调度,TM拉起后会向ResourceManager注册。
(JobManager的职责)
Flink如何做到流批一体
为什么需要流批一体
在业务中,常常有同时需要流式计算和批式计算的场景,如:抖音既需要实时推荐系统(流式计算),又需要每天统计播放量、评论量(批式计算)。而将流批分为两套系统的架构具有人力成本较高、数据链路冗余、数据口径不一致等缺点,所以需要流批一体。
(流批分离的架构)
Flink如何做到流批一体
在Flink中,Everything is stream,批式数据也可以看作一种特殊的在一段时间内的特殊数据流。所以不管是有边界的批式数据还是无边界的流式数据,Flink都可以天然的支持。并且Flink在流批一体上,从上面的API到底层的处理机制都是统一的,是真正意义上的流批一体。
(如上图:批处理是特殊的流处理,而OLAP处理又是特殊的批处理)
Flink主要从下面几个模块来做流批一体:
1.SQL层
2.DataStream API层统一,批和流都可以使用DataStream API来处理。
3.Schedual层架构统一,支持流批场景。
4.Failover Recovery层架构统一,支持流批场景。
5.Shuffle Service层架构统一,流批场景选择不同的Shuffle Service。
流批一体的Schedule层
在1.12之前的版本中,Flink支持以下两种调度模式
在EAGER模式下,因为是Stream作业场景,所以需要系统7*24小时不间断工作,所以所有的Task必须全部工作。所有的Task通过内存进行数据交换,这样的数据交换模式称为PIPELINE模式。
(EAGER模式示意图)
在LAZY模式下,因为是Batch作业场景,可以从上游到下游依次执行,所以可以让每个Task单独执行,而无需让所有Task同时运行。Task之间通过落盘+读盘的方式进行数据交换,这样的数据交换模式称为BLOCKING模式。
(LAZY模式示意图)
为了实现流批一体,Flink提出了Pipeline Region的抽象概念:由Pipeline连接的Task构成一个Pipeline Region。如此一来,从本质上来说,不管是流作业还是批作业,都是按照Pipleline Region的粒度来进行资源分配的。
(Pipeline Region模式的性能和占用资源都介于EAGER模式和LAZY模式之间)