Flink 运行架构和核心概念
几个角色的作用:
- 客户端:提交作业
- JobManager进程 任务管理调度
- JobMaster线程 一个job对应一个JobMaster 负责处理单个作业
- ResourceManager 资源的分配和管理,资源就是任务槽
- 分发器 提交应用,为每一个新提交的作业启动一个新的JobMaster 组件
- TaskManager 处理数据,每个TaskManager 都包含一定的slots
作业提交过程(Standlone)
- 提交作业到客户端
- 客户端解析参数 提交任务到JobManager
- JobManager通过分发器启动并提交应用(作业图 JobGraph),一个作业对应一个JobMaster
- JobMaster 将作业图 解析为可执行的执行图 Execution Graph,得到所需要的资源数,向资源管理器请求slots
- 资源管理器 向TaskManager请求资源 也就是slots
- TaskManager 会向资源管理器注册自己的任务槽,并提供
- JobMaster 分发任务给TaskManager
核心概念
并行度
特定算子子任务的个数。
设置有三种方式
- 代码中设置
stream.map(word -> Tuple2.of(word, 1L)).setParallelism(2);
- 提交应用时设置 全局设置
bin/flink run --p 2 --c com.atguigu.wc.SocketStreamWordCount
./FlinkTutorial-1.0-SNAPSHOT.jar
- 配置文件中设置
算子
算子有两种
- 一对一 类似于窄依赖
- 重分区 类似于shuffle
并行度相同的 一对一的算子可以合并 成为 算子链
// 禁用算子链
.map(word -> Tuple2.of(word, 1L)).disableChaining();
// 从当前算子开始新链
.map(word -> Tuple2.of(word, 1L)).startNewChain()
任务槽
TaskManager所分配的特定的资源(内存)
任务槽数量的设置,在配置文件中 默认的数量是1
taskmanager.numberOfTaskSlots: 8
任务槽只是隔离内存 不隔离cpu所以 一般会把任务槽的数量设置为cpu的核数,避免不同任务对cpu的争抢。
同一个作业中的不同任务节点的并行子任务,可以放到同一个slot中执行
任务槽和并行度的关系:
占用任务槽的数量等于作业的最大并行度。