Flink原理(四) 任務及排程

2022-06-13 06:09:07 字數 1596 閱讀 9839

一、任務排程

flink是通過task slot的來定義執行資源的,為優化資源的利用率,flink通過slot共享,可以將多個連續的task任務組成的乙個pipeline放在乙個slot中執行。當任務並行度》1時,並行任務中的每個pipeline就會分配到乙個slot去執行,這樣就會有乙個問題,若是任務的並行度大於集群中slot的個數了,會咋辦?首先,毫無疑問的一點是集群中的slot中都會有pipeline在跑;其次,多的任務就會等待現有的執行結束再去執行。下面結合官網中提供的例子說明一般情況下pipeline的分配情況[1]。

下圖中,乙個pipeline由source - map - reduce組成,其中mapfunction的並行度為4,reducefunction的並行度為3,集群有兩個taskmanager,其中每個taskmanager有3個slot。

圖中,每乙個pipeline由乙個顏色表示,其中包含3個小圈,每乙個圈代表乙個運算元,reducefunction的並行度為3,而mapfunction的為4,所以從map->reduce會發生shuffer。圖中,任務會以executionvertex 組成的 dag 圖的形式分配到兩個taskmanage的slot中,在taskmanager2的slot中,執行在其中乙個slot的dag僅有兩個executionvertex ,這裡會發生網路shuffer。

二、jobmanager 資料結構

執行在各個taskmanager的slot中任務的排程是通過jobmanager完成,除此之外,jobmanager還負責失敗任務的重啟等。

當jobmanager接受到jobgraph(jobgraph 是資料流的表現形式,包括jobvertex和中間結果intermediatedataset,每個運算元都有諸如並行度和執行**等屬性)會將其轉換為executiongraph,兩者之間的關係如下圖所示:

對每個 jobvertex,可以看成是經過運算元優化組成乙個個operator chain(每個operator chain可以是乙個或多個運算元)和相關資訊組成,而executionvertex可以看做是jobvertex的並行版,假設組成乙個jobvertex的operator chain的並行度為100,則在executiongraph中,executionvertex有100個,對應關係可以多看看上圖。

在jobgraph轉換到executiongraph的過程中[2],主要發生了以下轉變: 

圖中各個狀態說明情況很清楚,就不詳細說明,需要注意的是暫停狀態的作業將可能不會被完全清理。暫停狀態(suspended)僅處於本地終止狀態,在flink的ha模式下,意味著作業的執行僅在相應的 jobmanager 上終止,但集群的另乙個 jobmanager 可以從持久的ha儲存中恢復這個作業並重新啟動。

ref

[1][2]

Boost學習摘要 四任務

boost庫在工作 21 任務之一 boost asio io service ioserice 定義乙個任務佇列。ioserice.post boost bind run,10 執行佇列裡的任務。ioserice.post boost bind run,2 ioserice.post boost ...

作業四 任務分解(WBS)

近日忙於實驗,未來得及完成任務分解昨晚召開了緊急會議,才確定了任務劃分。主體分配如下 三名程式設計人員,乙個主編兩個輔編,一人做需求分析,一人做程式測試,一人專司文件。具體細節如下 在剩餘的三周左右的時間完成該專案,需求分析由徐巨集磊來做,預計2天,鑑於之前做過使用者需求調研,現用兩天足矣。介面設計...

FreeRTOS 四 任務掛起與恢復

函式 描述vtasksuspend 掛起乙個任務 vtaskresume 恢復乙個任務的執行 vtaskresumefromeisr 中斷服務函式中恢復乙個任務的執行 此函式用於將某個任務設定為掛起態,進入掛起態的任務永遠都不會進入執行態。退出掛起態的唯一方法就是呼叫任務恢復函式vtaskresum...