Flink 并行度(Parallel)

1,391 阅读2分钟

原文地址 Flink 之 并行度(Parallel)及设置

TaskManager 和 Slot

每个 TaskManager 中都会有一到多个 soltsolt 的数量通常与每个 TaskManager 节点的可用 CPU 内核数成比例。一般情况下你的 slot 数是你每个节点的 cpu 的核数。

Slot 是进程,如果使用 Flink on Yarn 模式不需要考虑资源的配置。

并行度 (Parallel)

一个 Flink 程序由多个任务(source、transformation sink)组成。 一个任务由多个并行的实例 (线程) 来执行, 一个任务的并行实例 (线程) 数目就被称为该任务的并行度。

并行度 (Parallel) 的设置

一个任务的并行度设置可以从多个层次指定

  1. Operator Level(算子层次)
  2. Execution Environment Level(执行环境层次)
  3. Client Level(客户端层次)
  4. System Level(系统层次)

Operator Level(算子层面)

一个算子、数据源和 sink 的并行度可以通过调用 setParallelism () 方法来指定

Execution Environment Level(执行环境层面)

执行环境 (任务) 的默认并行度可以通过调用 setParallelism () 方法指定。

通过这种方法指定时,所有的算子、数据源和 data sink 的并行度都相同

当然,执行环境的并行度可以通过显式设置算子的并行度而被重写

Client Level

并行度可以在客户端将 job 提交到 Flink 时设定。对于 CLI 客户端,可以通过 - p 参数指定并行度
./bin/flink run -p 10 WordCount-java.jar

System Level(尽量不使用)

在系统级可以通过设置 flink-conf.yaml 文件中的 parallelism.default 属性来指定所有执行环境的默认并行度

并行度图解

Example1

解释:

  1. fink-conf.yamltaskmanager.numberOfTaskSlots 默认值为 1,即每个 Task Manager 上只有一个 Slot ,此处是 3
  2. Example1 中,WordCount 程序设置了并行度为 1,意味着程序 SourceReduceSink 都只有一个实例,只占用一个 Slot

Example2 : 解释:设置并行度为 2 后,将占用 2 个 Slot

Example3
解释:设置并行度为 9,将占用 9 个 Slot

Example4
解释:

  1. 通过设置并行度为 9,并且设置 sink 的并行度为 1,则 SourceReduce 将存在9个实例,但是 Sink 只存在一个实例

总结

从上面的例子中我们可以看出

  • 算子的并行度不能超过集群中 Slot
  • 一个 Slot 中可以有不同种类的算子
  • 同种类的算子只能跑在不同的 Slot