前言 html
本文主要是想簡要說明Flink在集羣部署、任務提交、任務運行過程當中資源狀況,若表述有誤歡迎大夥留言分享,很是感謝!apache
1、集羣部署階段session
集羣部署這裏指的是Flink standalone模式,由於在Yarn模式(包括session、single job模式也成Per-job模式)是能夠僅經過Flink client提交任務到Yarn上,因此是否手動部署Flink集羣對任務的執行是沒有影響的。下圖[1]是簡單的Flink的集羣構成狀況,包括一個master(JobManager)、兩個worker(TaskManager)。至於Flink standalone模式的HA(通常有兩個JobManager加上若干個TaskManager組成)是經過zookeeper實現的,其主要思想是經過zookeeper選舉出JobManager的active節點,該結點負責資源分配等,另外一個節點爲standby。Flink的Yarn模式的高可用的經過在container中對JobManager的重啓實現的,其具體過程在此不詳細說明。spa
部署階段主要有如下兩個參數:code
1 #每一個TaskManager中slot的個數,在conf/flink-conf.yaml中,默認爲1 2 taskmanager.numberOfTaskSlots 3 #任務的並行度,默認爲1 4 parallelism.default
1)taskmanager.numberOfTaskSlots:每一個TaskManager中slot的數量,官方文檔推薦:和每一個TaskManager中物理CPU的個數成比例,好比:等於CPU的個數,或者是CPU個數的一半;htm
2)parallelism.default:任務的並行度,默認值爲1,該值能夠經過在程序中設定setParallesim()改變,並行度與slot的關係見下詳解;blog
2、任務提交階段內存
Flink集羣資源的使用狀況除了和已分配的資源有關外,還與並行度有關,已分配的資源表示Flink能夠利用這麼多資源,而實際能利用多少資源還和並行度有關。任務並行度的最大值由TaskManager集羣的Slot總數決定,如:slot總數爲10,則任務最大的並行度爲10.ci
在standalone模式中,Flink任務能利用的總資源已在啓動集羣時肯定,其並行經過在執行./flink run 時,經過可選參數[-p]肯定(不指定則爲默認值1)。資源
在Yarn模式中,均是先Yarn集羣中分配資源給新建的Flink集羣,以下圖,其詳細過程見文檔[2]。
Flink的Yarn模式session、single job模式在實現方法上仍是存在必定的區別:
1)session模式是先利用yarn-session.sh在yarn新建一個Flink集羣,而後利用./flink run flinkExample.jar提交任務,其資源分配的方式和standalone模式一致;
./yarn-session.sh -n 4 -s 8 -jm 3072 -tm 32768
-n:在yarn上分配了4個container,即分配了4個TaskManager;
-s:每一個TaskManager有8個slot;
-jm:每一個JobManager中的內存數;
-tm:每一個TaskManager中的內存數;
2)single job模式在命令中在申請資源的同時,提交任務,經常使用命令以下:
./flink run -m yarn-cluster -yn 7 -ys 8 example.jar
-yn:yarn上分配的container個數,即TaskManager的個數;
-ys:每一個TaskManager中slot的個數
其餘參數的具體使用方法能夠在控制檯中執行./flink、./yarn-session.sh獲得說明。
說明:session模式和single job的區別:
1)session模式:Flink任務運行結束後,從yarn上申請到的資源是不被釋放的,等待下一個Flink的提交,相似一個常住在yarn上永遠不會結束的yarn任務。由於,yarn的資源分配模式中好比fair策略仍是存在資源的競爭的,session模式資源的不釋放性,這樣能夠在Yarn提供資源分配上的基礎上進行實現資源隔離,也實現了對集羣物理環境的屏蔽,但在必定的程度上形成了資源的浪費;
2)single job模式和通常的yarn任務同樣,任務結束後就會釋放申請到的資源,使資源獲得重複利用。
因此session、single job模式的實際應用應根據需求使用,通常狀況下:
single job模式是按需申請資源,通常適合執行時間較長的大任務。此外,該模式下,每次提交任務都需單獨啓動Flink集羣本身的ResourceManager會形成必定的時延;
session模式共享資源,通常適合執行時間短的小任務。此模式下,會共享ResourceManager,因此啓動快。
【說明】這裏所說的ResourceManager不是Yarn的組件,是Flink自己的,關於深層的分析,見後續博客。
3、任務運行階段
假定一個3個TaskManager的集羣,每一個TaskManager有3個slot,集羣一個9個slot,從下圖中能夠獲得[3]:任務的並行度爲1時,只會用一個slot,並行度爲2會用2個slot,依次類推,當並行度爲9時,9個slot都會被利用,固然從example4中可知,能夠針對不一樣的算子(operator)定義並行度。
Ref:
[1]https://ci.apache.org/projects/flink/flink-docs-release-1.6/ops/deployment/cluster_setup.html
[2] https://ci.apache.org/projects/flink/flink-docs-release-1.6/ops/deployment/yarn_setup.html
[3]https://ci.apache.org/projects/flink/flink-docs-release-1.6/ops/config.html