一、基本概念

图1

图二 

1.task:一个task可以看成是一条完整的算子连(source -> sink),在默认情况下,且线程够用的情况下,一个task运行在一个slot里面;
2.subtask:task的组成单位,一个subtask由一个线程来运行;
3.operator chain:subtask中的算子连成链;
4.形成subtask的规则:①当数据发生重定向时例如KeyBy操作。②当程序算子并行度发生变化时。③通过算子手动切分Operator(disableOperatorChaining,startNewChain,disableChaining)
5.slot:隔绝内存,不隔绝cpu意味着一个slot可以有多个线程,所以,一个slot里面可以运行多个subtask,这是一种优化,相同资源组在同一个slot;
6.disableOperatorChaining:默认为开启,通过 env.disableOperatorChaining() 禁用;
7.startNewChain: 从当前算子之前开始划分一条新的Operator chain,在算子之后调用;
8.disableChaining: 针对某一个算子操作,断开算子前后的Operator chain,使算子单独作为一个subtask。
9. 共享资源槽【slotSharingGroup("name")】:相同资源组的subtask在一个slot执行,见图2,如果算子调用之后,从这个算子开始,接下来的算子在一个组内(slot内);

二、结合实际例子分析(主要是slotSharingGroup,其他startNewChain,disableChaining很好理解,网上也有很多列子,这里就不再赘述)

资源设置:taskmanager 3 slot 2

图三

图四

 图五

情况一:图三和图四对比,可以看出没有什么变化,因为souce和map并行度的改变他们并不属于一个subtask,所以map之后加不加disableChaining没有什么区别;

情况二:图三和图五对比,flilter操作单独运行在一个slot,所以slotSharingGroup,可以使从调用它的算子开始,接下来的算子,共享一个资源组(当然也可以分开operator chain);

情况三:当资源设置改为taskmanager为3,slot为1的时候运行图三,理论上只有3个slot,但是flink还是会申请4个slot,有一个taskmannager的slot数为2;

情况四:当资源设置依然为情况三,但是map的并行度设置为100,这个时候flink向yarn申请资源但是资源不够,最终崩掉了;

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐