赞
踩
作业管理器是一个 Flink 集群中任务管理和调度的核心,是控制应用执行的主进程
任务管理器
Dataflow Graph,Flink 程序中所有算子按照逻辑顺序连接在一起的一张图,由 Source、Transformation、Sink 三部分组成,以一个或多个 Source 开始以一个或多个 Sink 结束,类似 Spark 的 DAG
Map / FlatMap / Filter / KeyBy / Reduce / Fold / Aggregations / Window / WindowAll / Union / Window join / Split / Select
等并行子任务 (Subtask):一个算子操作可以 “复制” 成多份分布到不同的节点去运行,每个节点所运行的任务称为该算子的一个并行子任务
并行度 (Parallelism):
并行度的设置:
Flink 代码中设置:
//Flink环境对象调用setParallelism(n)方法设置整个程序全局的并行度
StreamExecutionEnvironment.getExecutionEnvironment().setParallelism(2)
//每个算子操作调用setParallelism(n)方法设置当前算子的并行度
dataStream.map(word -> Tuple2.of(word, 1L)).setParallelism(2);
提交 Flink 应用时设置
#命令行使用 -p 设置并行度
bin/flink run –p 2
#WebUI中在提交应用的配置框中填写并行度
配置文件中设置,对整个集群生效
vim flink-conf.yaml
parallelism.default: 2
不同算子之间的数据传输方式:
算子链 (Operator Chain):并行度相同、同一个 slot 共享组且数据传输方式为 one-to-one 的算子们可以合并成为一个算子链,形成一个 Task 由一个线程执行
设置:
//全局禁用算子链
env.disableOperatorChaining();
//禁用算子链
.map(word -> Tuple2.of(word, 1L)).disableChaining();
//从当前算子开始新链
.map(word -> Tuple2.of(word, 1L)).startNewChain()
Flink 的每一个任务 (Task) 需要一个线程来执行;TaskManager 是一个 JVM 进程,在其中可以启动多个独立线程来执行任务
为了控制一个 TaskManager 能接收多少个 Task,通过 Task Slot 对每个任务运行所占用的资源
做出明确的划分,一个 TaskManager 至少有一个 Task Slot
Task Slot:在 TaskManager 上拥有计算资源的一个固定大小的子集,一个 TaskManager 上的所有 Task Slot 会均分整个内存,所以任务之间不受影响
Task Slot 配置:
vim flink-conf.yaml
taskmanager.numberOfTaskSlots: 8
#由于slot之间不会涉及 CPU 的隔离,所以可以将 slot 数量配置为机器的 CPU 核心数,尽量避免不同任务之间对 CPU 的竞争
槽共享:默认情况下,同一个作业的不同任务节点的子任务可以在同一个 Task Slot 上执行,实现槽共享。但同一个任务节点的并行子任务必须独立占据一个 Task Slot 执行
通过设置 “slot 共享组” (SlotSharingGroup) 可以让某个算子对应的任务完全独占一个 slot
//共享组名称自定义,不设置则与前一个算子同属一个共享组,默认是default
.map(word -> Tuple2.of(word, 1L)).slotSharingGroup("1");
//此时,整个作业总共需要的 slot 数量,就是各个 slot 共享组最大并行度的总和
并行度与 Task Slot:并行度是程序运行时实际使用的并发线程资源;Task Slot 是整个 TaskManager 总共可用的并发线程资源
StreamGraph -> JobGraph -> ExecutionGraph -> 物理执行图
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。