您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關Flink怎么樣調度作業的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
Flink中的執行資源是通過任務執行槽來確定的。每個TaskManager有一個或者多個任務執行槽,每個可以運行一個并行任務的流水線。每個流水線包含多個連續的任務,像N次的MapFunction的并行實例跟一個ReduceFunction的n次并行實例。注意Flink經常同時執行多個連續的任務:對數據流程序來說都會這樣,但是對于批處理程序來只是頻繁發生。
下面的圖說明了這個情況。一個帶數據源的程序,一個MapFunction和一個ReduceFunction。數據源和MapFunction都是按照4個并發度來執行的,而ReduceFunction是按照3個并發度來執行。這是一個包含了順序Source到Map到Reduce的流水線。在一個有兩個TaskManager的集群上,每個TaskManager各有3個任務執行槽,這個程序將會按照下面的描述來執行。
在內部,Flink通過SlotSharingGroup 和 CoLocationGroup來確定那些任務可以共享一個任務槽(許可的), 分別要把那些任務嚴格的放置到同一個執行槽中。
在作業執行階段,JobManager會持續跟蹤那些分布式執行的任務,決定什么時候調度執行下一個任務(或者一組任務), 對完成的任務或執行失敗作出反應。
JobManager接收到JobGraph, JobGraph由包含操作的數據流(JobVertex) 和中間結果(IntermediateDataSet)來描述表示。每個操作都有屬性,像并行度執行的代碼。另外JobGraph包含一組附加的操作代碼執行必須的庫。
JobManager把JobGraph轉換成執行圖ExecutionGraph。ExecutionGraph執行圖 是一個JobGraph的并行版本:對于每個JobVertex ,它包含每個并行子任務的ExecutionVertex。一個并行度為100的操作會有一個JobVertex和100個ExecutionVertices。ExecutionVertex跟蹤具體任務的執行狀態。一個JobVertex中所有的ExecutionVertices都會在一個ExecutionJobVertex中。ExecutionJobVertex跟蹤操作的的整體狀態。除了頂點,ExecutionGraph執行圖還包含中間結果IntermediateResult 和中間結果分區 IntermediateResultPartition。前者跟蹤中間數據集的狀態,后者跟蹤每個分區的狀態。
每個執行圖ExecutionGraph有個一個與之關聯的作業狀態。這個作業狀態表示了作業執行的當前狀態。
一個Flink作業開始是創建狀態完成,然后轉為運行中狀態,在完成所有作業之后再轉為完成狀態。萬一失敗了,作業就會轉為失敗中狀態并且會撤銷所有運行的任務。如果作業定點到了最后的狀態并且作業不能重啟,那么作業轉為已經失敗狀態。如果作業可以重啟,那么作業會進入重啟中狀態。一旦作業重啟完成,作業會變成創建狀態完成。
如果用戶取消了作業,那么作業就變成了取消中狀態。同時還需要撤銷所有正在運行的任務。一旦所有的運行的任務到了最終的狀態,這個作業就編程了取消完成狀態。
不像已經完成狀態,已經取消和已經失敗狀態表示的是全局最終狀態,并且會粗發清理作業任務,已經掛起狀態是只在本地終端的。本地終端的意思是作業的執行已經被自己的JobManager終止了,但是FLink集群上的另外一個JobManager可以通過持久化的HA存儲獲取這個作業并重啟這個作業。因此被掛起的作業是不會被完全清理的。
在執行圖ExecutionGraph執行時,每個并行任務都經過了多個狀態,從被創建完成到已完成或已失敗。下面這個圖說明這些狀態和他們之間可能的轉移關系。一個任務可能會執行多次(例如:在故障恢復過程中)。由于這個原因,在一次執行中Execution會跟蹤ExecutionVertex的執行。
感謝各位的閱讀!關于“Flink怎么樣調度作業”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。