一、Flink集群中各角色运行架构
先说Flink集群中的角色吧,有三个分别是客户端(Client)、JobManager、TaskManager。
客户端负责接收作业任务并进行解析,将解析后的二进制数据发送给JobManager;JobManager是作业调度中心,负责对所有作业进行调度;TaskManager是作业执行的工作节点,负责执行具体的工作。其大致流程为:
那么更具体的各个角色的功能是如下图的:
三个角色之间都是通过Actor通信系统进行通信的。
客户端的具体功能就是:解析脚本提交过来的参数并进行封装,然后将任务提交给JobManager。
JobManager中又分为了三个组件:分发器、JobMaster、资源管理器。分发器负责接收任务并为每一个任务开启一个新的JobMaster组件;JobMaster负责处理单个的作业,在作业提交后,他会将JobGraph转化为一个物理层面的数据流图,然后向资源管理器发送请求获取资源,一旦获取到资源以后,JobMaster就会将这个数据流图发送到TaskManager上去执行。资源管理器就是接收JobMaster的资源请求然后去向TaskManager申请资源。
二、并行度
在执行作业时,要处理的数据量很大,可以将一个算子操作复制多分,多个算子共同的执行。那么一个算子的子任务的个数就是这个算子的并行度。而一个程序的并行度是这个程序中所有算子中的最大并行度的值。
三、算子链
在介绍算子链之前应该先介绍不同算子之间的数据流通形式,有一对一形式和重分区形式。一对一形式就是数据由前一个算子直接流向下一个算子;重分区就是数据从前一个算子会进行重新分区的操作之后再发给后面的算子。
算子链就是对并行度相同的且是一对一的算子进行的合并操作,合并之后两个算子就在同一个子任务中执行。这样做的好处就是可以减少不同线程之间的数据交换的时延。
四、任务槽(slot)
Flink中的每一个TaskManager都是一个JVM进程,他可以启动多个线程来执行任务。但是JVM进程能申请到的资源是有限的,它能够让多少个任务来执行呢?每个任务又能分配多少资源呢?这些都是TaskManager设计时的问题。为了解决这些问题,TaskManager在设计时以任务槽(slot)为最小资源分配单位来向线程任务分配资源。这样每个TaskManager就是最多让slot的数量的任务来执行。
任务槽(slot)和并行度都和程序的并行执行有关系。任务槽代表了程序能并行执行的最大程度,是静态的概念;并行度是程序在执行过程中的实际并发程度,是动态的概念。所以必须要求开启的TaskManager的总的任务槽的数量要比设置的并行度的值要大。