簡介
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系統。以下圖
api
什麼是task?
在spark中:多線程
RDD中的一個分區對應一個task,task是單個分區上最小的處理流程單元。被送到某個Executor上的工做單元,和hadoopMR中的MapTask和ReduceTask概念同樣,是運行Application的基本單位,多個Task組成一個Stage併發
上述引入spark的task主要是想帶着你們搞明白,如下幾個概念:
app
Flink的並行度由什麼決定的? Flink的task是什麼? Flink的並行度由什麼決定的?
這個很簡單,Flink每一個算子均可以設置並行度,而後就是也能夠設置全局並行度。oop
Api的設置優化
.map(new RollingAdditionMapper()).setParallelism(10)
全局配置在flink-conf.yaml文件中,parallelism.default,默認是1:能夠設置默認值大一點spa
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有五個,最終須要五個線程。code
默認狀況下,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
taskmanager.numberOfTaskSlots:3
每個taskmanager中的分配3個TaskSlot,3個taskmanager一共有9個TaskSlot
parallelism.default:1
運行程序默認的並行度爲1,9個TaskSlot只用了1個,有8個空閒。設置合適的並行度才能提升效率。
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