1. 程式人生 > >Flink入門教程--Jobs and Scheduling(任務和排程)

Flink入門教程--Jobs and Scheduling(任務和排程)

該文件簡單描述了Flink是如何排程Job的,以及如何在JobManager上表現並跟蹤Job狀態。

排程

Flink通過任務槽(Task Slot)定義執行資源,每個TaskManager都有一或多個任務槽,每個任務槽都可以執行一個並行任務流,一個流包括多個連續的任務,例如一個MapFunction的第n個並行例項與一個ReduceFunction的第n個並行例項的連續任務。注意,Flink通常會併發執行連續的任務,對於Streaming 程式來說,任何情況都如此執行;而對於batch 程式,多數情況也如此執行。

下圖舉例說明。由一個data source、一個MapFunction和一個ReduceFunction組成的程式,data source和MapFunction的併發度都為4,而ReduceFunction的併發度為3。一個數據流由Source-Map-Reduce的順序組成,在具有2個TaskManager,每個TaskManager都有3個Task Slot的叢集上執行,則程式執行情況如圖所述。

Assigning Pipelines of Tasks to Slots

Flink內通過SlotSharingGroupCoLocationGroup來定義哪些task共享一個task slot,也可以自定義某些task部署到同一個task slot中。

JobManager資料結構

在job執行期間,JobManager會持續跟蹤分散式任務,來決定什麼時候排程下一個task(或者tasks),並且對完成的或執行失敗的任務進行響應。

JobManager接收JobGraph,JobGraph是資料流的表現形式,包括Operator(JobVertex)和中間結果(intermediateDataSet)。每個Operator都有諸如並行度和執行程式碼等屬性。此外,JobGraph還擁有一些在Operator執行程式碼時所需要的附加庫。

JobManager將JobGraph轉換為ExecutionGraph,ExecutionGraph是JobGraph的並行版本:對每個JobVertex,它的每個並行子任務都有一個https://d.docs.live.net/72f746bc85b3dbdf/%E6%96%87%E6%A1%A3/Flink/Documents.one“>ExecutionVertex。一個並行度為100的Operator將擁有一個JobVertex和100個ExecutionVertex。ExecutionVertex會跟蹤其特定子任務的執行狀態。來自一個JobVertex的所有ExecutionVertex都由一個

ExecutionJobVertex管理,ExecutionJobVertex跟蹤Operator總體的狀態。除了這些節點之外,ExecutionGraph同樣包括了IntermediateResultIntermediateResultPartition,前者跟蹤IntermediateDataSet的狀態,後者跟蹤每個它的partition的狀態。

JobGraph and ExecutionGraph

每個ExecutionGraph具有與其相關聯的作業狀態。此作業狀態指示作業執行的當前狀態。

Flink job首先處於建立狀態,然後切換到執行狀態,並且在完成所有工作後,它將切換到完成狀態。在失敗的情況下,job切換到第一個失敗點,即取消所有正在執行任務的地方。如果所有job節點都已達到最終(或者說不可更改)狀態,並且job不可重新啟動,則job將轉換為失敗。如果作業可以重新啟動,那麼它將進入重新啟動狀態。一旦完成重新啟動,它將變成建立狀態

在使用者取消作業的情況下,將進入取消狀態 ,這需要取消所有當前正在執行的任務。一旦所有執行的任務已經達到最終(或者說不可更改)狀態,該作業將轉換到已取消狀態

完成狀態不同,取消狀態失敗狀態表示一個全域性的終端狀態,並且觸發清理工作,而暫停狀態僅處於本地終端上。本地終端意味著job的執行已在相應的JobManager上終止,但Flink叢集的另一個JobManager可以從持久的HA儲存中恢復這個job並重新啟動。因此,處於暫停狀態的job將不會被完全清理。

States and Transitions of Flink job

在執行ExecutionGraph期間,每個並行任務經過多個階段,從建立完成失敗 ,下圖說明了它們之間的狀態和可能的轉換。任務可以執行多次(例如故障恢復)。所以,一個Execution跟蹤一個ExecutionVertex的執行,每個ExecutionVertex都有一個當前Execution(current execution)和一個前驅Execution(prior execution)。

States and Transitions of Task Executions