- 基于flink-1.8.1
概述
- parallelism指的是并行度的意思。在 Flink 里面代表每個任務的并行度,適當的提高并行度可以大大提高 job 的執行效率,比如你的 job 消費 kafka 數據過慢,適當調大可能就消費正常了。
- slot指的是插槽的意思,flink中任務的并行性由每個 Task Manager 上可用的 slot 決定。
如何設置flink job的parallelism
- 在flink的配置文件中
flink-conf.yaml
,默認的并行度為1; - 在以shell的方式提交flink job的時候,可以使用
-p
指定程序的并行度;
./bin/flink run -p 10 ../word-count.jar
- 在flink job程序內設置并行度
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(10);
注意:這樣設置的并行度是你整個程序的并行度,那么后面如果你的每個算子不單獨設置并行度覆蓋的話,那么后面每個算子的并行度就都是這里設置的并行度的值了。
- 每個算子指定并行度;
data.keyBy(new xxxKey())
.flatMap(new XxxFlatMapFunction()).setParallelism(5)
.map(new XxxMapFunction).setParallelism(5)
.addSink(new XxxSink()).setParallelism(1)
- 并行度設置優先級是:算子設置并行度 > env 設置并行度 > 配置文件默認并行度
如何理解flink中的slot
- flink-conf.yaml中默認taskmanager.numberOfTaskSlots=1;
-
以flink架構模型為例進行分析:
flink-model.jpg - 圖中 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。這種共享可以有更好的資源利用率。
-
以官網上的thread process為例說明一下
taskmanager.jpg - 上面圖片中有兩個 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的區別
-
1-slot 是指 taskmanager 的并發執行能力;
slot-taskmanager.jpg - 如上圖所示:taskmanager.numberOfTaskSlots:3;即每一個 taskmanager 中的分配 3 個 TaskSlot, 3 個 taskmanager 一共有 9 個 TaskSlot。
-
2-parallelism 是指 taskmanager 實際使用的并發能力
parallelism-taskmanager.jpg - 如上圖所示:parallelism.default:1;即運行程序默認的并行度為 1,9 個 TaskSlot 只用了 1 個,有 8 個空閑。設置合適的并行度才能提高效率。
-
3-parallelism 是可配置、可指定的;
example-1.jpg -
上圖中 example2 每個算子設置的并行度是 2, example3 每個算子設置的并行度是 9。
example-4.jpg - example4 除了 sink 是設置的并行度為 1,其他算子設置的并行度都是 9。