Flink流批一体的Scheduler层 | 青训营笔记

453 阅读2分钟

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

Scheduler负责将作业的DAG转换为分布式环境中可以执行的Task。

image.png

  1. Flink-1.12之前,支持以下两种调度模式:
调度模式特点场景
eager一个作业需要执行,一定要申请到这个作业所需的全部资源,当拿到全部资源以后,才去调度这个作业的全部Taskstream
lazy一个DAG图有上游和下游,先处理上游,上游将数据处理之后,数据会进行落盘或存在内存中,然后把上游资源释放掉,用上游释放的资源再去调度下游。这种模式需要的资源少,但Task需要一个一个地执行,执行时间长Batch

如下图所示:

  • eager模式下,12个Task都拿到资源才能调度,这样才能认为一个流作业真正运行起来了
  • lazy模式下,只要有一个Task的资源,整个作业就能运行起来了。

image.png

  1. 在新版的Flink调度机制里,提出了一个概念叫Pipeline Region

image.png

如上图所示,横轴代表性能,纵轴代表所需资源数量。

lazy模式的性能最低,所需资源最少

eager模式性能最高,所需资源最多

为了能兼容以上两种调度场景,又提出了Pipeline Region调度模式。 如果所有Task之间的Shuffle交互没有Blocking,全是Pipeline,则认为全在一个Pipeline Region里面。如果一个流全是无限数据集,那么认为整个流是一个Pipeline Region,就会作为一个整体,Pipeline Region作业必须全部调度起来。

Pipeline是为了让调度层面能够同时去处理这两种场景而做的一个抽象

  • all_edges_blocking:

    • 批处理,所有Task之间的交互全是Blocking模式。

    • Blocking模式就是,A1产生的数据不会立即发送给B1,中间需要落盘,这样,A1结束之后,B1可以在A1写出的磁盘文件里直接读数据 。

    • 如果所有Task之间的交互全是Blocking模式,就叫做all_edges_blocking

    • 一个Pipeline Region和另一个Pipeline Region之间如果是Blocking,那就一定会切成不同的Pipeline Region

  • all_edges_pipelined

    • 如果所有Task的交互都走Pipeline,整个作业12个Task,可以认为是一个Pipeline Region,这样,整个作业作为一个Pipeline Region调度,需要12个Task的资源,作业才能整体调度起来

    • Pipeline就是,A1产生的数据直接发给B1,中间不落盘,直接走内存

Pipeline Region就是对流和批做了一个抽象,它们可以在同一个调度器里调度,在调度层做了一个统一。