本文是參考官方文檔結合本身的理解寫的,所引用文獻均已指明來源,若侵權請留言告知,我會立馬刪除。此外,如果表達欠妥的地方,歡迎大夥留言指出。html
前言apache
在上一篇博客Flink原理(二) ——資源一文中已簡要說了在Flink集羣中資源的分配狀況,這篇博客嘗試從定義算子以後,任務是如何分配的,以及任務是如何使用資源的。app
Flink會在生成JobGraph階段,將代碼中能夠優化的算子優化成一個算子鏈(Operator Chains)以放到一個task(一個線程)中執行,以減小線程之間的切換和緩衝的開銷,提升總體的吞吐量和延遲。下面以官網中的例子進行說明,以下圖1所示:優化
圖中,source、map、[keyBy|window|apply]、sink算子的並行度分別是二、二、二、二、1,通過Flink優化後,source和map算子組成一個算子鏈,做爲一個task運行在一個線程上,其簡圖如圖中condensed view所示,並行圖如parallelized view所示。算子之間是否能夠組成一個Operator Chains,看是否知足如下條件:spa
圖中,有兩個節點(TaskManage,即兩個進程),每一個節點中有3個slot,每個task(一個Thread)均跑在一個slot中。線程
但實際上,Flink在默認狀況下,只要子任務是來自同一個Job,是容許子任務(subtask,就是相似source/map、window等)共享一個slot的,即便是不一樣任務的子任務也是能夠共享一個slot。這樣有兩個好處:3d
1) 一個Job的最高並行度就是Flink集羣中slot的個數,這樣咱們就不須要計算一個程序能夠包含多個task;htm
2) 能夠得到更好的資源利用率。若沒有slot共享,像source/map這種不是很是耗資源的算子(官網上是說非資源密集型、non-intensive)就和window這種很是耗資源的算子佔用相同多的資源(一個slot),如圖2所示;若容許slot共享,則圖2中集羣最大的並行度可爲6,以下圖3所示:blog
在能夠共享slot的狀況下,較耗資源的subtask就能夠比較均勻的分佈在Flink集羣中的taskManager上。什麼意思了?如圖3,相似window的算子均勻的分佈在每一個slot中,而圖2中,僅在兩個slot中。從圖3中咱們也能夠看出一個slot中能夠運行多個Thread。進程