10-flink TaskManager 和 Slots
发布网友
发布时间:2023-02-04 05:13
我来回答
共1个回答
热心网友
时间:2023-05-06 19:06
思考问题:
1.怎么样实现并行计算?
答:设置并行度。多线程,不同任务放到不同线程上。
2.并行的任务,需要占用多少slot?
3.一个流处理程序,到底包含多少个任务?
一、TaskManager和Slot的关系介绍
process:进程
Treads:线程
二、并行度(parallelism)
每一个线程占用一个slot,上图一中任务合并为上图二所示(任务链,后续讲解),图中算子并行度最大的(算子后面的中括号数字代表并行度)为2,所以整个flink程序的并行度为2,所以只需要2个slot就可以跑起来。
One-to-one:
stream(比如在source和map operator之间)维护着分区以及元素的顺序。那意味着flatmap 算子的子任务看到的元素的个数以及顺序跟source 算子的子任务生产的元素的个数、顺序相同,map、fliter、flatMap等算子都是one-to-one的对应关系。类似于spark中的窄依赖
Redistributing:
stream(map()跟keyBy/window之间或者keyBy/window跟sink之间)的分区会发生改变。每一个算子的子任务依据所选择的transformation发送数据到不同的目标任务。例如,keyBy()基于hashCode重分区、broadcast和rebalance会随机重新分区,这些算子都会引起redistribute过程,而redistribute过程就类似于Spark中的shuffle过程。类似于spark中的宽依赖
图中:A4 代表 A任务有4个,C2表示C任务2个,以此类推
taskmanager.numberOfTaskSlots:3 每个taskmanager设置了并行度为3
设一共有3个TaskManager,每一个TaskManager中的分配3个TaskSlot,也就是每个TaskManager可以接收3个task,一共9个TaskSlot,如果我们设置parallelism.default=1,即运行程序默认的并行度为1,9个TaskSlot只用了1个,有8个空闲,因此,设置合适的并行度才能提高效率。
三、思考
假设当前可用的slot只有1个,任务有4个,slot不够用的时候,则会一直等待分配资源,直到超时报错。
slot推荐设置为当前机器的核心数,假设cpu核心数为4核,则设置4。
slot占用数量与并行度最大的算子一致。