Flink05---Flink中任务是怎么分配的?

1.相关Flink术语

任何一个大数据框架都离不开大数据的一些专业术语,Flink也不例外,但每个框架也有自己的特点,独特的技术,使得Flink中也会有些自己术语,不先了解清楚的话很难对其原理和过程理解透彻。

  • 并行度:一个特定算子的子任务的个数被称之为其并行度。
//给sum算子设置并行度
sum().setParallelism(2);
  • 插槽(slot):Flink中定义的处理资源单元,存在于TaskManager里面,插槽的数量限制了TaskManager能执行的任务数量,也可说成是线程数。
  • slot共享:同一个TaskManager中的slot被不同任务或同一个任务的子任务共享。如果设置了slot共享组,那么组内的任务都可以共享一个slot,不同组之间就一定是占用不同的slot,针对代码中的每一个算子设置如下。当然不设置共享组的话则同一个任务默认是同一个共享组,共享组名称为default。还有是算子的共享组与前面算子的一样,后随前组。
//在sum算子下设置slot共享组
sum().slotSharingGroup("red");
//在flatmap算子下设置slot共享组
flatmap(function).slotSharingGroup("green")
  • 任务(task):提交的一个Job可以切分出多个任务(Task),一个任务可在一个slot中执行,每一个任务也就是一个线程。
  • 并行子任务:每个任务由并行度切分的多个并行任务。
  • one-to-one:数据传输形式之一,不涉及重分区
  • Redistributing:数据传输形式之一,涉及数据的重分区,具体哪种传输方式视算子的种类而定。
//重分区
sum().shuffle;
  • 任务链:作用是合并任务减少通信开销。

下面图片来源于尚硅谷教学视频,是TM和Slot数量在flink-conf.yaml中的配置,配置的TM和Slot数量
下面是并行度设置1或2的区别,1的话只占用了一个插槽,资源没有得到充分的利用。可在代码中\提交时\配置文件中修改。
并行度1

并行度2
为了解决输出时保证写入的顺序和正确性,sink算子的并行度需要设置为1或小一些。
在这里插入图片描述

2.任务调度原理

  • 运行作业需要插槽的数量怎么确定的?
    插槽的数量等于每个共享组中最大并行度之和,若是只有一个default共享组,那么就等于之中(算子)的最大并行度。
  • 两个任务什么条件下可以合并到一起呢?
    算子之间传输数据的形式为one-to-one(在执行图上体现是forwarding),并且两个算子之间的并行度和共享组必须一致。

3.任务分配原理

  • 所有的Flink程序都是由Source(读取数据源)、Transformation(各种算子处理数据)和Sink(输出数据)组成。
  • Flink的作业是根据执行图操作的,Flink中执行图可以分为四层:StreamGraph->JobGraph->ExcutionGraph->物理执行图,JobGraph由客户端生成,并和jar包一起提交给JobManager,ExcutionGraph是由JobManager根据JobGraph生成的,根据并行度拆分,并由JobManager发送给TaskManager的,TaskManager又会将ExcutionGraph转换为物理执行图。
  • 下图是一个例子的任务链,可以看到key by和sink任务由于是forward,分区数也是相同,于是合并成了一个大任务。故任务数量由7个变成了5个任务,由于没设置共享组,所以由最大并行度2决定所需的插槽数量为2。
    在这里插入图片描述
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值