flink java 并行度_flink solt和并行度
簡介
Flink運行時主要角色有兩個:JobManager和TaskManager,無論是standalone集群,flink on yarn都是要啟動這兩個角色。JobManager主要是負責接受客戶端的job,調度job,協調checkpoint等。TaskManager執行具體的Task。TaskManager為了對資源進行隔離和增加允許的task數,引入了slot的概念,這個slot對資源的隔離僅僅是對內存進行隔離,策略是均分,比如taskmanager的管理內存是3GB,假如有兩個個slot,那么每個slot就僅僅有1.5GB內存可用。Client這個角色主要是為job提交做些準備工作,比如構建jobgraph提交到jobmanager,提交完了可以立即退出,當然也可以用client來監控進度。
Jobmanager和TaskManager之間通信類似于Spark 的早期版本,采用的是actor系統。如下圖
什么是task?
在spark中:
RDD中的一個分區對應一個task,task是單個分區上最小的處理流程單元。被送到某個Executor上的工作單元,和hadoopMR中的MapTask和ReduceTask概念一樣,是運行Application的基本單位,多個Task組成一個Stage
上述引入spark的task主要是想帶著大家搞明白,以下幾個概念:
Flink的并行度由什么決定的?
Flink的task是什么?
Flink的并行度由什么決定的?
這個很簡單,Flink每個算子都可以設置并行度,然后就是也可以設置全局并行度。
Api的設置
.map(new RollingAdditionMapper()).setParallelism(10)
全局配置在flink-conf.yaml文件中,parallelism.default,默認是1:可以設置默認值大一點
Flink的task是什么?
按理說應該是每個算子的一個并行度實例就是一個subtask-在這里為了區分暫時叫做substask。那么,帶來很多問題,由于flink的taskmanager運行task的時候是每個task采用一個單獨的線程,這就會帶來很多線程切換開銷,進而影響吞吐量。為了減輕這種情況,flink進行了優化,也即對subtask進行鏈式操作,鏈式操作結束之后得到的task,再作為一個調度執行單元,放到一個線程里執行。如下圖的,source/map 兩個算子進行了鏈式;keyby/window/apply有進行了鏈式,sink單獨的一個。
說明:圖中假設是source/map的并行度都是2,keyby/window/apply的并行度也都是2,sink的是1,總共task有五個,最終需要五個線程。
默認情況下,flink允許如果任務是不同的task的時候,允許任務共享slot,當然,前提是必須在同一個job內部。
結果就是,每個slot可以執行job的一整個pipeline,如上圖。這樣做的好處主要有以下幾點:
1.Flink 集群所需的taskslots數與job中最高的并行度一致。也就是說我們不需要再去計算一個程序總共會起多少個task了。
2.更容易獲得更充分的資源利用。如果沒有slot共享,那么非密集型操作source/flatmap就會占用同密集型操作 keyAggregation/sink 一樣多的資源。如果有slot共享,將基線的2個并行度增加到6個,能充分利用slot資源,同時保證每個TaskManager能平均分配到重的subtasks,比如keyby/window/apply操作就會均分到申請的所有slot里,這樣slot的負載就均衡了。
鏈式的原則,也即是什么情況下才會對task進行鏈式操作呢?簡單梗概一下:
上下游的并行度一致
下游節點的入度為1 (也就是說下游節點沒有來自其他節點的輸入)
上下游節點都在同一個 slot group 中(下面會解釋 slot group)
下游節點的 chain 策略為 ALWAYS(可以與上下游鏈接,map、flatmap、filter等默認是ALWAYS)
上游節點的 chain 策略為 ALWAYS 或 HEAD(只能與下游鏈接,不能與上游鏈接,Source默認是HEAD)
兩個節點間數據分區方式是 forward(參考理解數據流的分區)
用戶沒有禁用 chain
slot和parallelism
1.slot是指taskmanager的并發執行能力
在hadoop 1.x 版本中也有slot的概念,有興趣的讀者可以了解一下
taskmanager.numberOfTaskSlots:3
每一個taskmanager中的分配3個TaskSlot,3個taskmanager一共有9個TaskSlot
2.parallelism是指taskmanager實際使用的并發能力
parallelism.default:1
運行程序默認的并行度為1,9個TaskSlot只用了1個,有8個空閑。設置合適的并行度才能提高效率。
3.parallelism是可配置、可指定的
1.可以通過修改$FLINK_HOME/conf/flink-conf.yaml文件的方式更改并行度
2.可以通過設置$FLINK_HOME/bin/flink 的-p參數修改并行度
3.可以通過設置executionEnvironmentk的方法修改并行度
4.可以通過設置flink的編程API修改過并行度
5.這些并行度設置優先級從低到高排序,排序為api>env>p>file.
6.設置合適的并行度,能提高運算效率
7.parallelism不能多與slot個數。
slot和parallelism總結
1.slot是靜態的概念,是指taskmanager具有的并發執行能力
2.parallelism是動態的概念,是指程序運行時實際使用的并發能力
3.設置合適的parallelism能提高運算效率,太多了和太少了都不行
4.設置parallelism有多中方式,優先級為api>env>p>file
總結
以上是生活随笔為你收集整理的flink java 并行度_flink solt和并行度的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《SpringCloud超级入门》使用E
- 下一篇: 基于jsp+Spring boot+my