關於Flink slot 和kafka topic 分區關系的說明


今天又有小伙伴在群里問 slot 和 kafka topic 分區(以下topic,默認為 kafka 的 topic )的關系,大概回答了一下,這里整理一份

首先必須明確的是,Flink Task Manager 的 slot 數 和 topic 的分區數是沒有直接關系的,而這個問題其實是問的是: 任務的並發數與 slot 數的關系

最大並發數 =  slot 數

這里有兩個原因:每個算子的不同並行不能在同一slot,不同的算子可以共享 slot ,所以最大並行度 就等於 slot 數。

這樣就有了slot數和topic 分區數的間接關系在:我們可能會根據 kafka 的分區數配置我們 source (和后續的其他算子)算子的 並行度,而算子的 最大並行度決定 slot 數據(TM 的數量由 slot 的數量反向計算)

看一張官網的圖:

說明:

第一個圖:3 個 Task Manager,每個 3 個 slot,總共 9 個 slot

第二個圖:Example 1 ,wordcount 案例,1 個並發,算子chain 在一起,只占一個 slot

第三個圖:Examlple 2,wordcount 案例,2 個並發,占2 slot 。三種設置並行度的方式:

flink-conf.yaml 參數 parallelism.default: 2
flink -p 2  # 啟動時加 -p 參數指定
env.setParallelism(2)

第四個圖:Example 3,wordcount 案例,9 個並發,占 9  slot 

第五個圖:Example 3,wordcount 案例,source 9 個並發,sink 1 個並發,占 9 個slot(sink 和其中一個 source chain 在一起了)

看一個具體的任務:  

我們要讀的 topic 有 2 個 partition,我們設置 source 算子的並行度為 2,那我們最小就需要 4 個 slot,Task Manager 配置的 slot 數為2, 那最少就需要 2 個 TM 任務才能正常運行(不考慮其他算子)。

關鍵代碼:

env.setParallelism(2) env.addSource(source).addSink(sink)

提交到yarn 上

 

上面說明了算子的並發度與TM 的 slot 數的關系。

下面看下,kafka 分區數與 source 算子的並行度關系。

在不修改 kafka consumer 的分區分配策略的情況下,soure 的並行度與 topic 分區數在不同情況下,會有不同的表現,如下:

1、source 並行度 =  topic 分區數,正好的情況,一個 並行度,讀一個分區的數據

2、source 並行讀  < topic 分區數, 會出現部分 並行度讀多個 分區的情況,具體可見:flink 讀取kafka 數據,partition分配 

3、source 並行度 > topic 分區數,會出現部分並行度沒有數據的情況

 

總結下問題:slot 數和 topic 的分區數並沒有直接關系,以kafka 做 source 的情況最多,而 kafka topic 的分區數一般又是 Flink source 的並行度,又是 Flink 任務的最大並發度,一般情況下又是 slot 的數量,所以會有一種 slot 數 和 topic 分區數 有直接關系的假象。

 

注:Task Manager 的 slot 數在 flink-conf.yaml 中配置 參數:

# The number of task slots that each TaskManager offers. Each slot runs one parallel pipeline.

taskmanager.numberOfTaskSlots: 2 # 默認值為1

 官網 slot 配置說明:https://ci.apache.org/projects/flink/flink-docs-release-1.9/ops/config.html#configuring-taskmanager-processing-slots (slot 數量推薦是 standalone 集群每台機只有一個 Task Manager的情況下,具體配置要看實際任務情況)

 

 

歡迎關注Flink菜鳥公眾號,會不定期更新Flink(開發技術)相關的推文


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM