从逻辑执行图的转换到任务调度 | 青训营笔记

98 阅读1分钟

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

1. 从逻辑执行图到支持并发的执行图

假设sink算子并发配置为1,其他算子并发配置为2 image.png

2. operator chain

  • 假设上游source读完数据之后,下游紧接着做map的一些操作,不需要有Hash,Shuffle的一些过程,这样就可以把source和map这两个操作链接(operator chain)在一起。

  • 链接在一起,就是在真正的物理执行上,source[1]和map[1]可以真正在一个线程里执行。也就是说,source[1]读完1条数据,map[1]紧接着就去做相应的解析。

  • 这样做,会带来一定的优化:

    • 假设没有operator chain,source是一个线程,map是一个线程。在真正处理的时候,会有线程之间的一些切换、会从一个线程发送到另一个线程、还需要一些序列化和反序列化的操作。
    • 两个算子chain在一起,就可以当成一个Task处理。source[1]读完数据,map[1]紧接着进行解析,它们是在一个线程中串行的执行。它可以减少线程之间切换、减少数据的序列化与反序列化、减少数据在TaskManager缓冲区之间的一些交换,减少延迟的同时,提高了整体的吞吐能力

3. 将Task调度到TaskManager上

一个TaskManager起几个slot是用户可以定义的,这里一个TaskManager起了3个slot,一个TaskManager可以理解为一个进程,每个slot在TaskManager中对应一个线程。

通过JobManager调度,将source[1] map[1],keyBy[1],...,调度到TaskManager的slot上执行,这样,作业就真正调度起来了。

image.png