調度系統跳過任務失敗策略

調度系統跳過任務失敗策略

前言

????前一篇文章(調度系統的核心與定製型任務開發)介紹了對調度系統定製開發實現的兩個核心功能,一個是跨項目的依賴問題,另外一個是給定多個時間段一天多次的調度任務。接下來,我們將介紹一個重量級的場景,對於調度任務中某些job失敗,我們忽略掉,繼續執行後面的任務流。

引出場景

????很多人問這個有什麼應用場景?剛開始我也有疑問,後面nlp的組長提出他這邊的一個應用場景:搜索業務中,每天凌晨會對開始對特徵進行加工,然後利用xgboost模型去進行排序,這是一個調度任務。問題來了,如果這個調度任務某一個環節出現問題,那麼為了能讓任務繼續執行下去,需要寫一系列代碼進行控制。很多人認為調度系統實現不了,答案是NO!

不多說,上圖: 從左往右,左圖是任務流中每一個job都成功的情況,中間的圖形是job D失敗,導致整個人任務流失敗,右圖是在忽略job D失敗的情況下,任務流仍然全部執行的情況。

任務中的每個job都執行成功

任務中的job D失敗導致整個任務失敗

任務中的job D失敗,整個任務仍然成功完成

由於上述例子非常的簡單,其中的job都是簡單的shell命令,現在真是需要拿生產中的數據和代碼進行測試。

實例測試

????接下來將拿具體的實例進行測試。具體的話,如果某任務依賴多個表,若其中某個依賴的表沒有同步,那麼任務執行的情況如何?是跳過代碼段還是忽略考慮更新的數據表。讓我們測試一下: 測試方法: 1.修改腳本arrivalday_spark_etl.py,對最終的結果表增加etl_time,主要目的是檢查數據條數是否缺失。

2.修改腳本arrivalday_spark_etl.py,對由SellerCube.Product表生成的臨時表tmp.tmp_rf_arriveday_SupplierOfProductInfo增加etl_time,為了檢查當我們設置SellerCube.Product任務失敗,生成臨時表的代碼是否依然執行,同時注釋掉刪除臨時表。具體的修改如下:

結果驗證:

對應的任務依賴圖:

將兩個結果進行對比: 1) 忽略依賴的錯誤job,則可以將代碼中依賴此錯誤job的代碼看成固定的代碼,類比常量。如果依賴的job是關於表的同步,則忽略此錯誤job,可認為若當天的數據沒有同步完成,則仍然使用昨天的數據進行同步。如果依賴的job是基於時間段的調度,則若數據沒有在指定時間段同步完成,仍然使用之前的數據進行後續代碼的執行。

原理

????這裡做簡單原理介紹,事實上在對任務進行依賴分解的過程中,會將每個依賴的job寫入到資料庫,當對任務進行調度時,每個job執行成功或者失敗,會寫入資料庫,通過會有相應的狀態(success/fail)。這個時候為了時任務繼續執行下去,可以將job失敗的狀態進行標記,標記為success,從而任務仍然正常執行。


推薦閱讀:

Windows任務管理器五大奇招
任務管理器下載|任務管理器(Task Manager DeLuxe) v1.8.7 免費綠色版
高效人士必備的多任務操作系統
Moo.do 中文入門手冊:增強版 Workflowy,一個無限層級的純文本任務管理工具
新手提示:OKR不是項目管理,更不是任務管理

TAG:數據倉庫 | ETL | 任務管理 |