1、Flink 运行时架构

Flink 运行时架构主要包含几个部分:Client、JobManager(master节点)和TaskManager(slave节点)。

 

一、

Client:Flink作业在哪台机器上面提交,那么当前机器称之为Client。用户开发的Program 代码,它会构建出 DataFlow graph,然后通过Client提交给JobManager。

JobManager:是主(master)节点,相当于YARN里面的ResourceManager,生产环境中一般可以做HA高可用。

JobManager会将任务进行拆分,调度到TaskManager上面执行。

TaskManager:是从节点(slave),TaskManager才是真正实现task的部分。

 

Client 提交作业到JobManager,就需要跟JobManager进行通信,它使用 Akka 框架或者库进行通信,另外Client与JobManager进行数据交互,使用的是

Netty框架。AKKA通信基于 Actor System,Client可以向JobManager发送指令,比如Submit job 或者 Cancel/update job。

JobManager 也可以反馈信息给Client,比如status updates,Statistics和results。

 

Client提交给JobManager的是一个Job,然后JobManager将job拆分成task,提交给TaskManager(worker)。

JobManager与TaskManager也是基于Akka进行通信,JobManager发送指令,比如 Deploy/Stop/Cancel Tasks或者触发CheckPoint,

反过来TaskManager也会跟JobManager 通信返回Task Status,Heartbeat(心跳),Statistics等。另外TaskManager之间的数据通过网络进行传输,

比如 Data Stream做一些算子的操作,数据往往需要在TaskManager之间做数据传输。

 

TaskManager Slot

flink同步配置界面 flink client_flink同步配置界面

 

 

 TaskManager是进程,他下面运行的task(整个Flink应用是Job,Job可以拆分成很多task)是线程,每个task/subtask(线程)下可运行

一个或者多个operator,即 OperatorChain。Task是class,抽象的;subtask是Object,具体的。(这样类比学习。)

 

一个TaskManager通过Slot(任务槽)来控制它上面可以接受多少个task,比如一个TaskManager划分了3个Task Slot(仅限内存托管,目前CPU未做隔离),

它只能接受3个task。Slot均分TaskManager所托管的内存,比如一个TaskManager有6g 内存,那么每个Slot分配2G。

 

同一个TaskManager中的task共享TCP连接(通过多路复用)和心跳消息。它们还可以共享数据集和数据结构,从而减少每个任务的开销。

一个TaskManager有N个槽位只能接受N个Task吗?不是,后面会说共享槽位。

 

二、

OperatorChain && Task

为了更高效的分布式执行,Flink会尽可能的将 operator的subtask链接(chain)在一起形成task。

flink同步配置界面 flink client_flink同步配置界面_02

 

 数据流(逻辑视图)

创建Source(并行度设置为1)读取数据源,数据经过FlatMap(并行度设置为2)做转换操作,然后数据经过Key Agg(并行度设置为2)做聚合操作,

最后经过Sink(并行度设置为2)将数据输出。

数据流(并行化视图)

并行度为1的Source读取数据源,然后FlatMap并行度为2读取数据源进行转化操作,然后数据经过Shuffle交给并行度为2的Key Agg进行聚合操作,

然后并行度为2的Sink将数据输出,未优化前的task总和为7。

数据流(优化后的视图)

并行度为1的Source读取数据源,然后FlatMap并行度为2读取数据源进行转化操作,然后数据经过Shuffle交给Key Agg进行聚合操作,

此时Key Agg和Sink操作合并为一个task(注意:将KeyAgg和Sink两个operator进行了合并,因为这两个合并后并不会改变整体的拓扑结构),

它们一起的并行度为2,数据经过Key Agg和Sink之后将数据输出,优化后的task总和为5。