DataWorks調度配置最佳實戰

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

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

直播視頻回看,戳這裏!
分享資料下載,戳這裏!
更多精彩內容傳送門:大數據計算技術共享計劃 — MaxCompute技術公開課第二季

以下內容根據演講視頻及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個實例。
7f134f9b499a2b9dc1a0701ba290cab7b96b5484

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

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

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

出錯機制
在公共雲上,如果開啓了出錯機制,那麼默認會重試3次,每次間隔2分鐘,如果經歷了3次重試還是失敗,那麼就會返回失敗狀態。
48979d28719f068693f6a522b1890d80ff878618

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

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

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

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

在下圖中可以看出,天任務可以相互依賴,上游存在跨週期依賴。如果下游任務想要成功執行,就需要上游任務成功運行作爲前提。下圖中可以看出,2014年和2015年的兩個實例分別存在相互依賴關係,上游的任務會依賴上一週期的一層子節點,如果上游昨天的任務未成功運行,那麼就會阻塞昨天的任務和今天的下游任務。
c240e2623b316386aa49d9e72ba11c175918b315

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

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

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

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

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

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

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

案例3:小時任務依賴天任務
小時任務依賴天任務且天任務存在跨週期依賴,則小時任務的所有周期都會依賴昨天的天任務。
2b92281f283d8736b62ef8802427173fe9306b85

案例4:天任務依賴小時任務
對於這樣的情況需要配置依賴一層子節點,比如上游的小時任務跨週期依賴下游的定時天任務,效果即上游小時任務會在每一週期都會依賴上一版本的下游任務。
94a6fc54897cba95afee96e2317bbe32cf881bb5

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

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

跨週期跨版本的使用
(1) 針對跨週期跨版本依賴的優化
和之前的依賴關係對比,可以看到有了自依賴後,跨週期依賴的邊少了很多。這是因爲如果有了自依賴,當前週期成功的前提必須是前一個週期成功了,於是下游跨週期並跨版本依賴就減少成了跨週期依賴。
2ade4d9a46b51077c45b4bf2fa92ad18f90ea8bf

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

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

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

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

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

閱讀原文
本文爲雲棲社區原創內容,未經允許不得轉載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章