大数据学习之Flink——05Flink的Parallelism和Slot
本文借鉴了: http://www.54tianzhisheng.cn/2019/01/14/Flink-parallelism-slot/
一. Parallelism(并行度)
1. 什么是Parallelism
parallelism 是并行的意思,在 Flink 里面代表每个任务的并行度,适当的提高并行度可以大大提高 job 的执行效率
2. 设置Parallelism
一个任务的并行度设置可以从 4 个层面指定:
Operator Level(算子层面) Execution Environment
Level(执行环境层面)
Client Level(客户端层面)
System Level(系统层面)这 些 并 行 度 的 优 先 级 为 Operator Level>Execution Environment Level>Client Level>System Level。
-
Operator Level
Operator、Source 和 Sink 目的地的并行度可以通过调用 setParallelism()方法来指定 -
Execution Environment Level
任务的默认并行度可以通过调用 setParallelism()方法指定。为了以并行度 3 来执行 所有的 Operator、Source 和 Sink,可以通过如下方式设置执行环境的并行度 -
客户端
并行度还可以在客户端提交 Job 到 Flink 时设定。对于 CLI 客户端,可以通过-p 参数指定并行度
web UI
命令行 -
系统层面
在系统级可以通过设置flink-conf.yaml文件中的parallelism.default属性来指定所 有执行环境的默认并行度。
二. Slot
1. 什么是Slot
- 图中 Task Manager 是从 Job Manager 处接收需要部署的 Task,任务的并行性由每个 Task Manager 上可用的 slot 决定。每个任务代表分配给任务槽的一组资源,slot 在 Flink 里面可以认为是资源组,Flink 将每个任务分成子任务并且将这些子任务分配到 slot 来并行执行程序。
- 例如,如果 Task Manager 有四个 slot,那么它将为每个 slot 分配 25% 的内存。 可以在一个 slot 中运行一个或多个线程。 同一 slot 中的线程共享相同的 JVM。 同一 JVM 中的任务共享 TCP 连接和心跳消息。Task Manager 的一个 Slot 代表一个可用线程,该线程具有固定的内存,注意 Slot 只对内存隔离,没有对 CPU 隔离。默认情况下,Flink 允许子任务共享 Slot,即使它们是不同 task 的 subtask,只要它们来自相同的 job。这种共享可以有更好的资源利用率。
-
上面图片中有两个 Task Manager,每个 Task Manager 有三个 slot,这样我们的算子最大并行度那么就可以达到 6 个,在同一个 slot 里面可以执行 1 至多个子任务。
-
那么再看上面的图片,source/map/keyby/window/apply 最大可以有 6 个并行度,sink 只用了 1 个并行。
-
每个 Flink TaskManager 在集群中提供 slot。 slot 的数量通常与每个 TaskManager 的可用 CPU 内核数成比例。一般情况下你的 slot 数是你每个 TaskManager 的 cpu 的核数。
三. Parallelism 和 Slot
-
slot 是指 taskmanager 的并发执行能力
taskmanager.numberOfTaskSlots:3
每一个 taskmanager 中的分配 3 个 TaskSlot, 3 个 taskmanager 一共有 9 个 TaskSlot。 -
parallelism 是指 taskmanager 实际使用的并发能力
parallelism.default:1
运行程序默认的并行度为 1,9 个 TaskSlot 只用了 1 个,有 8 个空闲。设置合适的并行度才能提高效率。
-
parallelism 是可配置、可指定的
上图中 example2 每个算子设置的并行度是 2, example3 每个算子设置的并行度是 9。
example4 除了 sink 是设置的并行度为 1,其他算子设置的并行度都是 9。