Scheduler 层架构统一|青训营笔记

185 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第3天。

Scheduler(调度层)主要负责将作业的DAG转化为在分布式环境中可以执行的TASK。1.12之前的Flink版本中,支持以下两种调度模式:

image-20220728174105807.png

1)EAGER模式

需要全部资源先到位,然后同时调度全部的TASK,因为流的数据是源源不断的,需要持续计算,不能像批一样先跑上游,再跑下游。

假设有一个作业,A算子有2个并发,B有两个并发,C有4个并发,D有4个并发。B1的数据平均分到C1、C2;C到D出现了keyBy或者GroupBy的聚合操作,需要进行hash shuffle(通过哈希值进行洗牌分发)。

需要12个TASK(虚线框中)同时调度起来,才能真正执行作业。

image-20220728175645850.png

2)LAZY模式

先调度上游(DAG可分为上下游),上游计算结束后,可释放上游资源,再调度下游。所需要的资源少,但是时间长。

批计算由于数据量大,通常需要的资源更多,一次性给不了批作业那么多资源,因此通常采用LAZY模式。

假设集群只有一个slot资源可以运行,可先跑A1,再跑A2,直到整个作业全部跑完。

image-20220728175714590.png

3)统一化|Pipeline Region

由Pipeline的数据交换方式连接的TASK构成一个Pipeline Region,不论是流作业还是批作业,都按照 Pipeline Region的粒度来申请资源和调度任务。

仍以上文的作业为例,可分为两种调度情况。

①ALL_EDGES_BLOCKING

所有TASK之间的数据交换都是BLOCKING模式(即A的数据不会立刻发给B,而会先写入磁盘(落盘),A结束后,B仍可通过磁盘读取A产出的数据),12个TASK可以认为是12个Pipeline Region。

②ALL_EDGES_PIPELINED

所有TASK之间的数据交换都是PIPELINE模式(即A的数据通过内存直接发给B,然后A的内存就可以释放了),12个TASK可以认为是1个Pipeline Region。

个人总结

重点在于了解EAGER模式和LAZY模式的特点,并能够举例说明;还需了解Pipeline Region的两种调度情况。