1. 程式人生 > >DataWorks調度配置最佳實戰

DataWorks調度配置最佳實戰

剖析 流行 dcb 需要 mark 2014年 ppt 不依賴 計算平臺

摘要: DataWorks基於MaxCompute作為核心的計算、存儲引擎,提供了海量數據的離線加工分析、數據挖掘的能力。通過DataWorks,可對數據進行數據傳輸、數據轉換等相關操作,從不同的數據存儲引入數據,對數據進行轉化處理,最後將數據提取到其他數據系統。

摘要:DataWorks基於MaxCompute作為核心的計算、存儲引擎,提供了海量數據的離線加工分析、數據挖掘的能力。通過DataWorks,可對數據進行數據傳輸、數據轉換等相關操作,從不同的數據存儲引入數據,對數據進行轉化處理,最後將數據提取到其他數據系統。在本文中,阿裏巴巴計算平臺產品專家祎休為大家介紹了通過DataWorks進行新增調度資源、調度資源管理、配置不同周期任務依賴等最佳實踐。

以下內容根據演講視頻及PPT整理而成。

大家在使用MaxCompute的時候更多地是在DataWorks上面實現基於ETL加工、調度、配置以及雲上數倉的構建任務。本文將與大家分享DataWorks後臺強大調度系統的實現邏輯以及一些具體的實現案例,希望能夠對大家在做雲上數倉相關工作時有所幫助。

本次分享主要分成3個部分,在第一部分是調度的基本介紹,主要為大家分享DataWorks的基本概念,這部分將幫助大家理解後續的依賴關系。第二部分將與大家分享依賴關系的簡介,比如自依賴、跨周期依賴以及版本依賴等,以及這些依賴之間會在後臺生成什麽樣的實例等。最後一部分將與大家分享依賴關系的實戰,為大家剖析兩個案例,並回顧本次分享的內容。總體上而言,通過本次分享希望能夠幫助大家區分DataWorks和MaxCompute的不同點,讓大家更好地理解DataWorks的定位是MaxCompute之上雲上數倉的開發工具。

一、調度基本介紹
首先需要明確兩個概念:節點和實例。如下圖左側所示,節點是描述DataWorks數據分析和處理過程的基本單元,比如Shell、ODPS SQL、ODPS MR、PyODPS等。而在Dataworks後臺前一天23:30的節點會生成快照,統一生成的運行實例。對於用戶而言,在配置調度上的最大感觸就是在23:30分之前提交的調度配置,會在23:30分之後生效,而在23:30分之後配置的一些依賴關系只能夠間隔一天再統一地生成實例。實例會對非天任務進行拆分,如一小時一次的小時節點將會拆分成具體的24個實例。
技術分享圖片

此外,還需要明白兩個關系,就是調度規則和依賴關系。對於調度規則而言,首先需要滿足依賴關系,即上遊節點必須完成,才能調度下遊節點;其次,需要判斷定時的時間是否已經到了,如果到了就立即執行,如果沒有到,就需要等待時間。對於依賴關系而言,正如下圖中右側所示,是描述兩個或多個節點之間的語義連接關系,其中上遊節點的狀態將影響其他下遊節點的運行狀態,反之則不成立。

技術分享圖片

此外,還需要為大家介紹跨周期依賴和自依賴關系。在如下圖右側的欄目去打開就能看到,跨周期的依賴有很多選項,在這些選項背後有很多的概念。第一個就是跨周期依賴,這其實也分了跨周期和跨版本的兩個概念,如何理解呢?其實,跨周期依賴是針對小時任務的,也就是小時任務依賴同一天的上一個周期。比如每個節點按照小時進行調度,那當前的節點能否調度起來需要依賴於上一個周期是否成功返回了。另外一部分就是跨版本依賴,這種依賴就是針對於天依賴的任務做的,比如今天任務能否成功運行依賴於昨天的任務能否成功返回,這裏更多的會有一些數據的先後依賴關系,因此在這部分需要做跨版本的依賴配置。而自依賴可以理解成為跨周期和跨版本的依賴,針對於天任務,如果配置了自依賴,那麽就是會依賴於昨天版本的實例。針對於小時任務,就會依賴於每天的最後一個周期。
技術分享圖片

二、依賴關系簡介
調度屬性:凍結
在依賴關系裏面,可以通過整體的架構圖來看。在WorkFlow裏面可以看到,屬性裏面有一個凍結的概念,周期實例中的凍結只針對當前實例,且正在運行中的實例,凍結操作無實際效果,並不會殺掉正在運行的實例。凍結狀態的任務會生成實例,但是不會運行,可以理解為空跑狀態。如果需要運行凍結的實例,需要解凍實例,單擊重跑,實例才會開始運行。
技術分享圖片

出錯機制
在公共雲上,如果開啟了出錯機制,那麽默認會重試3次,每次間隔2分鐘,如果經歷了3次重試還是失敗,那麽就會返回失敗狀態。
技術分享圖片

對於調度屬性而言,DataWorks有5種調度周期,分別是分鐘、小時、日、周和月。如果周期大於天的,那麽由於調度的實例劃分時按天生成的,所以周月任務在不運行的哪一天實際是按照空跑處理的。如果選擇日調度,而且不勾選定時調度的,定時時間統一按照0點處理。
技術分享圖片

此外,跨周期依賴裏面有4個選項,他們分別對應了不同的概念。比如“不依賴上一調度周期”就是其不會形成跨周期和版本的依賴關系,而如果勾選了“自依賴”,那麽就會依賴當前節點的上一周期,只有當上一周期運行結束並且返回成功,當前節點才能運行。另外一部分,如果選擇了如圖所示的,依賴於“一層子節點”或者等待“下遊任務的上一周期結束”才能運行。此外,還能自定義一些節點,當然在節點裏面可以輸入節點ID或者名稱與一些自定義的任務進行依賴關系配置。而如果勾選了“等待自定義任務的上一周期結束,才能繼續運行”,這樣當前的工作流任務就會等待依賴的任務節點結束才會運行。
技術分享圖片

自依賴的使用
如下圖所示,大家可以在DataWorks運維中心裏面看到每天生成的運行實例的圖。這與開發面板不太一樣,如果存在實現的上下遊依賴關系,那麽就是正常的依賴關系,而有虛線的就是跨周期或者自依賴的關系。從這些可以判斷,一些用戶配置了自依賴,如果發現今天的任務沒有跑起來,就需要去追溯昨天的任務是否運行正常,如果昨天的任務也沒有正常運行就需要繼續向上追溯。
技術分享圖片

三、依賴配置實戰
調度依賴關系
如下所示的整頁圖裏面是天任務的相互依賴,箭頭表示的數據流向。如果根據下圖將箭頭反方向調整就可以理解成依賴關系,也就是下遊會依賴上遊。現在箭頭則表示數據的流向,假設現在有兩個天調度的任務,兩個都是淩晨開始運行的,那麽當上遊任務成功運行了,下遊才會運行起來,而且如果上遊任務沒有運行完成,下遊任務即使定時時間到了也無法運行。

在下圖中可以看出,天任務可以相互依賴,上遊存在跨周期依賴。如果下遊任務想要成功執行,就需要上遊任務成功運行作為前提。下圖中可以看出,2014年和2015年的兩個實例分別存在相互依賴關系,上遊的任務會依賴上一周期的一層子節點,如果上遊昨天的任務未成功運行,那麽就會阻塞昨天的任務和今天的下遊任務。
技術分享圖片

如下圖所示的小時任務比較流行,大家可能會經常配置6個小時或者8個小時的任務,這樣會生成3至4個實例,這樣只要一個周期未成功,後續的所有周期都會阻塞,並且可以有效避免一個周期任務運行慢了導致後續周期定時到了之後並發運行。
技術分享圖片

調度基礎依賴類型介紹
(1) 小時任務依賴天任務
從下圖中可以看出,是小時任務依賴天任務。在左側中是2014年12月31日的情況,實例B1、B2和B3都會依賴實例A,實例A是12點運行,而實例B1、B2以及B3都是小時任務,所以需要依賴天任務,需要等待天任務完成之後才能運行。而當定時的時間到了,這些任務才會並發地執行,在這裏就是上遊實例A成功運行了,下遊的B1、B2和B3才能同時並發地執行。
技術分享圖片

(2) 天任務依賴小時任務
實例A是實例B1、B2和B3的下遊節點,也就是說實例A依賴於上遊的幾個小時任務節點。這樣一來,天任務就需要等待小時任務的所有周期都完成了才能去調度這樣的天任務,所以如果按照每8個小時跑一個小時任務,這樣就能夠拆分成3個實例,只有當這些小時實例都成功運行之後,下遊的天任務才能在時間已經到了的情況下運行起來。
技術分享圖片

(3) 小時任務依賴小時任務且周期數一樣
比如上遊節點是小時任務,下遊的節點也是小時任務,當這兩個小時任務都是按照每幾個小時生成時,其生成的實例數是一樣的,在這種情況下可以理解為父子節點都是小時任務,同時其周期數也是一樣的。而每一個運行的實例都會形成一個一一對應的關系。當然,若下遊的定時晚於上遊的定時,在下遊定時時間到了的時候也不能調度,需要等待上遊對應的周期完成之後才能開始調度。
技術分享圖片

(4) 小時任務依賴小時任務且周期數不同
在這種情況下,可能上遊按照12個小時運行一次,那麽一天可能會生成兩個實例,下遊則可能每天按照6個小時,那麽這個時候可能生成6個實例。其實,可以從圖中看出其是如何依賴的關系,小時任務依賴小時任務,如果其周期數不同,如果下遊周期數大於上有的周期數,則會依據就近原則掛依賴,也就是時間小於或者等於自己且不重復的依賴。
技術分享圖片

自依賴的使用
案例1:小時任務依賴天任務
在如下圖所示的任務依賴中,箭頭表示了數據的流向。之前案例也講到,如果上遊天任務完成時下遊有多個周期定時時間已到,會導致這些周期被並發調度起來,如果不希望下遊並發調度起來,則需要將下遊小時任務設置成自依賴,即依賴上一周期,也就是本節點,這樣形成一個自依賴。需要註意的是,自依賴會依賴跨版本(跨天),如果昨天最後一個周期未完成,會導致今天的任務無法調度。如下圖所示,實例A屬於天任務,而下遊實例B則是每8小時執行一次的小時任務,實例B之間則會有一些虛線的依賴關系。比如實例A在12點運行成功了,那麽實例B在運行的時候需要先去判斷實例A的狀態與自己的定時時間,生成完之後才會依次執行B2、B3,而當出現了跨天的情況,比如執行到B4的時候,需要去判斷昨天最後一個實例的狀態。
技術分享圖片

案例2:天任務依賴小時任務
在下圖裏面,箭頭表示依賴關系。如果天任務依賴小時任務,需要等待小時任務的所有周期都完成了才能開始調度。比如在上遊按照每小時運行一次的數據,等所有數據都落入到對應的分區之後,再按照一定的數據匯總24小時的數據。如果需要天任務盡量按照定時時間開始調度。則可以配置上遊小時任務自依賴,待上遊小時任務定時時間最近(且小於)的周期完成後,下遊天任務就會被調度。
技術分享圖片

案例3:小時任務依賴天任務
小時任務依賴天任務且天任務存在跨周期依賴,則小時任務的所有周期都會依賴昨天的天任務。
技術分享圖片

案例4:天任務依賴小時任務
對於這樣的情況需要配置依賴一層子節點,比如上遊的小時任務跨周期依賴下遊的定時天任務,效果即上遊小時任務會在每一周期都會依賴上一版本的下遊任務。
技術分享圖片

案例5:小時任務依賴小時任務
這種情況比較復雜,圖中的實線表示依賴關系,虛線則表示自依賴關系。為了實現這樣的依賴關系,需要在下遊節點設置依賴自定義節點(父節點ID)。在這個case比較特別,即可看出其實這個依賴圖中存在兩個概念,既有跨周期(依賴上遊小時任務的上一周期),又存在跨版本(依賴上遊小時任務的上一版本的所有周期)。
技術分享圖片

調度依賴關系的具體實現示意圖
首先對於定義關系圖而言,上遊三個節點,下遊一個節點這樣的情況而言,在每天23:30分會生成一個節點快照,生成一個可運行的實例。當實例運行的時候,會依次運行上遊的各個節點,當各個節點全部運行成功了之後,下遊節點就會判斷是否已經到了自己能夠執行的時間,如果符合執行條件就會去執行。而如果上遊任何一個節點執行失敗了,就會導致下遊節點一直處於等待狀態。
技術分享圖片

跨周期跨版本的使用
(1) 針對跨周期跨版本依賴的優化
和之前的依賴關系對比,可以看到有了自依賴後,跨周期依賴的邊少了很多。這是因為如果有了自依賴,當前周期成功的前提必須是前一個周期成功了,於是下遊跨周期並跨版本依賴就減少成了跨周期依賴。
技術分享圖片

(2) 天任務依賴小時任務
在天任務依賴小時任務的場景下,系統需求統計截止到每小時的業務數據增量,然後在最後一個小時的數據匯總完成後,需要一個任務進行一整天的匯總。對於這樣的場景進行需求分析得到以下兩點:
1)每個小時的增量,即每整點起任務統計上個小時時間段的數據量。需要配置一個每天每整點調度一次的任務,每天最後一個小時的數據是在第二天第一個實例進行統計。
2)最後的匯總任務為每天執行一次,且必須是在每天最後一個小時的數據統計完成之後才能執行,那麽需要配置一個天任務,依賴小時任務的第一個實例。

如下圖中左側所示,可能期望的結果就是在調度任務的定義時,上遊是小時任務,每個小時運行一次,下遊是天任務,每天淩晨開始運行,就形成了這樣的依賴關系。而對於綠色的圖而言,對應的任務實例的狀況,只有當每天最後一個小時任務處理完成之後,才會去處理天任務。而當真正按照這種依賴關系進行配置,直接掛靠這種依賴關系,在調度系統中會生成右側所示的實例,但是這是不符合預期的。
技術分享圖片

而如果想要達到整體的需求,就需要配置上遊小時任務的自依賴。如果上遊的小時任務形成自依賴,那麽上遊的24個小時任務實例就會按照下圖左側中的實例進行依賴,當小時任務都生成之後才會去運行天任務。對於這樣的依賴關系,只需要去DataWorks裏面選擇跨周期依賴的自依賴就可以了。
技術分享圖片

(3) 小時任務依賴分鐘任務
對於小時任務依賴分鐘任務而言,有這樣的一種業務場景:已經有任務每30分鐘進行一次同步,將前30分鐘的系統數據增量導入到MaxCompute,任務定時為每天的每個整點和整點30分運行。現在需要配置一個小時任務,每6個小時進行一次統計,即每天分別統計0點到6點之間、6點到12點之間、12點到18點之間、18點到明天0點整之間的數據。從分析來看,我們期望的效果就是如下圖中左側所示,上遊的分鐘任務,每隔30分鐘調度一次,下遊是小時任務,每隔6個小時調度一次,那麽對應的實例裏面就會產生對應的依賴關系。
技術分享圖片

在進行配置時需要選擇上遊的節點進行自依賴,在如下所示的依賴圖中可以看出,分鐘級別的依賴任務有自依賴,它會依賴上一周期的成功,並觸發下遊的小時任務的統計。
技術分享圖片

原文鏈接

本文為雲棲社區原創內容,未經允許不得轉載。

DataWorks調度配置最佳實戰