Flink原理(三)——Task(任務)、Operator Chain(算子鏈)和Slot(資源)

本文是參考官方文檔結合本身的理解寫的,所引用文獻均已指明來源,若侵權請留言告知,我會立馬刪除。此外,如果表達欠妥的地方,歡迎大夥留言指出。html


前言apache

  在上一篇博客Flink原理(二) ——資源一文中已簡要說了在Flink集羣中資源的分配狀況,這篇博客嘗試從定義算子以後,任務是如何分配的,以及任務是如何使用資源的。app

1、Task和Operator Chains

  Flink會在生成JobGraph階段,將代碼中能夠優化的算子優化成一個算子鏈(Operator Chains)以放到一個task(一個線程)中執行,以減小線程之間的切換和緩衝的開銷,提升總體的吞吐量和延遲。下面以官網中的例子進行說明,以下圖1所示:優化

   圖中,source、map、[keyBy|window|apply]、sink算子的並行度分別是二、二、二、二、1,通過Flink優化後,source和map算子組成一個算子鏈,做爲一個task運行在一個線程上,其簡圖如圖中condensed view所示,並行圖如parallelized view所示。算子之間是否能夠組成一個Operator Chains,看是否知足如下條件:spa

  • 上下游算子的並行度一致
  • 下游節點的入度爲1 
  • 上下游節點都在同一個 slot group 中
  • 下游節點的 chain 策略爲 ALWAYS(能夠與上下游連接,map、flatmap、filter等默認是ALWAYS)
  • 上游節點的 chain 策略爲 ALWAYS 或 HEAD(只能與下游連接,不能與上游連接,Source默認是HEAD)
  • 兩個節點間數據分區方式是 forward
  • 用戶沒有禁用 chain(代碼中是否配置disableChain())
  【如果對這裏還有疑惑,能夠參看 Operator Chains一文】

2、Task slot和resource

  結合以前資源一文,咱們能夠得知上文中的任務在Flink集羣中的分佈應以下圖2所示:

   圖中,有兩個節點(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。進程

 
  綜上所述,算子被定義後,先根據條件優化算子鏈 ,而後組成一個個subtask,最後根據是否能夠共享slot分佈在taskManager的slot中執行。其中細節,且聽下回分解。
 
 Ref:
相關文章
相關標籤/搜索