Flink 是一个分布式系统,需要有效分配和管理计算资源才能执行流应用程序
运行时由两种类型的进程组成
- 一个 JobManager
- 一个或者多个 TaskManager
任务提交流程图如下:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiYTMfhHLlN3XnxCM38FdsYkRGZkRG9lcvx2bjxCMy8VZ6l2cs0TQE9EeRhVY2J1RkpnVuFWQClGVF5UMR9Fd4VGdsATNfd3bkFGazxSUhxGatJGbwhFT1Y0Mk9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL5kzMklTY1UDNmRjZxMjY5YzM2QDO5UWM5QjNzMjNxQ2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
什么是JobManager
可以理解为一个厂长,协调 Flink 应用程序的分布式执行的功能
- 它决定何时调度下一个 task(或一组 task)
- 对完成的 task 或执行失败做出反应
- 协调 checkpoint、并且协调从失败中恢复等等
JobManager进程由三个不同的组件组成
-
ResourceManager
负责 Flink 集群中的资源提供、回收、分配 管理 task slots
-
Dispatcher
提供了一个 REST 接口,用来提交 Flink 应用程序执行
为每个提交的作业启动一个新的 JobMaster
运行 Flink WebUI 用来提供作业执行信息
-
JobMaster
负责管理单个JobGraph的执行,Flink 集群中可以同时运行多个作业,每个作业都有自己的 JobMaster
注:
至少有一个 JobManager,高可用(HA)设置中可能有多个 JobManager,其中一个始终是 leader,其他的则是 standby
什么是TaskManager
可以理解为车间组长
- 负责计算的worker,还有上报内存、任务运行情况给JobManager等
- 至少有一个 TaskManager,也称为 worker执行作业流的 task,并且缓存和交换数据流
-
在 TaskManager 中资源调度的最小单位是 task slot
TaskManager是由task slot组成,task slot 的数量表示并发处理 task 的数量
Task Slots 任务槽
- Task Slot是Flink中的任务执行器,每个Task Slot可以运行多个subtask ,每个subtask会以单独的线程来运行
- 每个 worker(TaskManager)是一个 JVM 进程,可以在单独的线程中执行一个(1个solt)或多个 subtask
- 为了控制一个 TaskManager 中接受多少个 task,就有了所谓的 task slots(至少一个)
- 每个 task slot 代表 TaskManager 中资源的固定子集
- 注:
- 所有Task Slot平均分配TaskManger的内存, TaskSolt 没有 CPU 隔离
- 当前 TaskSolt 独占内存空间,作业间互不影响
- 一个TaskManager进程里有多少个taskSolt就意味着多少个并发
- task solt数量建议是cpu的核数,独占内存,共享CPU
一个 task slot 中可以执行多个算子
算子 opetator: source、 transformation、 sink
对于分布式执行,Flink 将算子的 subtasks 链接成 tasks,每个 task 由一个线程执行
图中有5 个 subtask 执行,因此有 5 个并行线程
- Task 正好封装了一个 Operator 或者 Operator Chain 的 parallel instance。
- Sub-Task 强调的是同一个 Operator 或者 Operator Chain 具有多个并行的 Task
- source和map算子组成一个算子链,作为一个task运行在一个线程上
- 算子链接成 一个 task 它减少线程间切换、缓冲的开销,并且减少延迟的同时增加整体吞吐量
Task Slot是Flink中的任务执行器,每个Task Slot可以运行多个task即subtask ,每个sub task会以单独的线程来运行
官方文档:https://ci.apache.org/projects/flink/flink-docs-release-1.13/zh/docs/learn-flink/overview/
如上图显示的Flink 算子之间可以通过【一对一】模式或【重新分发】模式传输数据
官方文档链接:
https://ci.apache.org/projects/flink/flink-docs-release-1.13/zh/docs/concepts/flink-architecture/#tasks-and-operator-chains
https://ci.apache.org/projects/flink/flink-docs-release-1.13/zh/docs/concepts/glossary/
Flink的并行度概念和调整优先级
Flink 是分布式流式计算框架
- 程序在多节点并行执行,所以就有并行度 Parallelism
-
DataStream 就像是有向无环图(DAG),每一个 数据流(DataStream) 以一个或多个 source 开始,以一个或多个
sink 结束
流程
- 一个数据流( stream) 包含一个或多个分区,在不同的线程/物理机里并行执行
-
每一个算子( operator) 包含一个或多个子任务( subtask),子任务在不同的线程/物理机里并行执行
一个算子的子任务subtask 的个数就是并行度( parallelism)
并行度的调整配置
- Flink流程序中不同的算子可能具有不同的并行度,可以在多个地方配置,有不同的优先级
-
Flink并行度配置级别 (高到低)
算子
map( xxx ).setParallelism(2)
全局env
env.setParallelism(2)
客户端cli
./bin/flink run -p 2 xxx.jar
Flink配置文件
/conf/flink-conf.yaml 的 parallelism.defaul 默认值
某些算子无法设置并行度
本地IDEA运行 并行度默认为cpu核数
注:
一个很重要的区分 TaskSolt和parallelism并行度配置
task slot是静态的概念,是指taskmanager具有的并发执行能力;
parallelism是动态的概念,是指 程序运行时实际使用的并发能力
前者是具有的能力比如可以100个,后者是实际使用的并发,比如只要20个并发就行。