目前大數據平台經常會用來跑一些批任務,跑批處理當然就離不開定時任務。比如定時抽取業務數據庫的數據,定時跑hive/spark任務,定時推送日報、月報指標數據。任務調度系統已經儼然成為了大數據處理平台不可或缺的一部分。
一、原始任務調度
記得第一次參與大數據平台從無到有的搭建,最開始任務調度就是用的Crontab,分時日月周,各種任務腳本配置在一台主機上。crontab 使用非常方便,配置也很簡單。剛開始任務很少,用着還可以,每天起床巡檢一下日志。隨着任務越來越多,出現了任務不能在原來計划的時間完成,出現了上級任務跑完前,后面依賴的任務已經起來了,這時候沒有數據,任務就會報錯,或者兩個任務並行跑了,出現了錯誤的結果。排查任務錯誤原因越來麻煩,各種任務的依賴關系越來越負責,最后排查任務問題就行從一團亂麻中,一根一根梳理出每天麻繩。crontab雖然簡單,穩定,但是隨着任務的增加和依賴關系越來越復雜,已經完全不能滿足我們的需求了,這時候就需要建設自己的調度系統了。
二、調度系統
多個任務單元之間往往有着強依賴關系,上游任務執行並成功,下游任務才可以執行。比如上游任務1結束后拿到結果,下游任務2、任務3需結合任務1的結果才能執行,因此下游任務的開始一定是在上游任務成功運行拿到結果之后才可以開始。而為了保證數據處理結果的准確性,就必須要求這些任務按照上下游依賴關系有序、高效的執行,最終確保能按時正常生成業務指標。
Airflow
Apache Airflow是一種功能強大的工具,可作為任務的有向無環圖(DAG)編排、任務調度和任務監控的工作流工具。Airflow在DAG中管理作業之間的執行依賴,並可以處理作業失敗,重試和警報。開發人員可以編寫Python代碼以將數據轉換為工作流中的操作。
主要有如下幾種組件構成:
-
web server: 主要包括工作流配置,監控,管理等操作
-
scheduler: 工作流調度進程,觸發工作流執行,狀態更新等操作
-
消息隊列:存放任務執行命令和任務執行狀態報告
-
worker: 執行任務和匯報狀態
-
mysql: 存放工作流,任務元數據信息
具體執行流程:
-
scheduler掃描dag文件存入數據庫,判斷是否觸發執行
-
到達觸發執行時間的dag,生成dag_run,task_instance 存入數據庫
-
發送執行任務命令到消息隊列
-
worker從隊列獲取任務執行命令執行任務
-
worker匯報任務執行狀態到消息隊列
-
schduler獲取任務執行狀態,並做下一步操作
-
schduler根據狀態更新數據庫
Kettle
將各個任務操作組件拖放到工作區,kettle支持各種常見的數據轉換。此外,用戶可以將Python,Java,JavaScript和SQL中的自定義腳本拖放到畫布上。kettle可以接受許多文件類型作為輸入,還可以通過JDBC,ODBC連接到40多個數據庫,作為源或目標。社區版本是免費的,但提供的功能比付費版本少。
XXL-JOB
XXL-JOB是一個分布式任務調度平台,其核心設計目標是開發迅速、學習簡單、輕量級、易擴展。將調度行為抽象形成“調度中心”公共平台,而平台自身並不承擔業務邏輯,“調度中心”負責發起調度請求;將任務抽象成分散的JobHandler,交由“執行器”統一管理,“執行器”負責接收調度請求並執行對應的JobHandler中業務邏輯;因此,“調度”和“任務”兩部分可以相互解耦,提高系統整體穩定性和擴展性。(后來才知道XXL是作者名字拼音首字母縮寫)
調度系統開源工具有很多,可以結合自己公司人員的熟悉程度和需求選擇合適的進行改進。
三、如何設計調度系統
調度平台其實需要解決三個問題:任務編排、任務執行和任務監控。
-
任務編排,采用調用外部編排服務的方式,主要考慮的是編排需要根據業務的一些屬性進行實現,所以將易變的業務部分從作業調度平台分離出去。如果后續有對編排邏輯進行調整和修改,都無需操作業務作業調度平台。
-
任務排隊,支持多隊列排隊配置,后期根據不同類型的開發人員可以配置不同的隊列和資源,比如面向不同的開發人員需要有不同的服務隊列,面向不同的任務也需要有不同的隊列優先級支持。通過隊列來隔離調度,能夠更好地滿足具有不同需求的用戶。不同隊列的資源不同,合理的利用資源,達到業務價值最大化。
-
任務調度,是對任務、以及屬於該任務的一組子任務進行調度,為了簡單可控起見,每個任務經過編排后會得到一組有序的任務列表,然后對每個任務進行調度。這里面,稍有點復雜的是,任務里還有子任務,子任務是一些處理組件,比如字段轉換、數據抽取,子任務需要在上層任務中引用實現調度。任務是調度運行的基本單位。被調度運行的任務會發送到消息隊列中,然后等待任務協調計算平台消費並運行任務,這時調度平台只需要等待任務運行完成的結果消息到達,然后對作業和任務的狀態進行更新,根據實際狀態確定下一次調度的任務。
調度平台設計中還需要注意以下幾項:
-
調度運行的任務需要進行超時處理,比如某個任務由於開發人員設計不合理導致運行時間過長,可以設置任務最大的執行時長,超過最大時長的任務需要及時kill掉,以免占用大量資源,影響正常的任務運行。
-
控制同時能夠被調度的作業的數量,集群資源是有限的,我們需要控制任務的並發量,后期任務上千上萬后我們要及時調整任務的啟動時間,避免同時啟動大量的任務,減少調度資源和計算資源壓力;
-
作業優先級控制,每個業務都有一定的重要級別,我們要有限保障最重要的業務優先執行,優先給與調度資源分配。在任務積壓時候,先執行優先級高的任務,保障業務影響最小化。
四、總結
ETL 開發是數據工程師必備的技能之一,在數據倉庫、BI等場景中起到重要的作用。但很多從業者連 ETL 對應的英文是什么都不了解,更不要談對 ETL 的深入解析,這無疑是非常不稱職的。做ETL 你可以用任何的編程語言來完成開發,無論是 shell、python、java 甚至數據庫的存儲過程,只要它最終是讓數據完成抽取(E)、轉化(T)、加載(L)的效果即可。由於ETL是極為復雜的過程,而手寫程序不易管理,所以越來越多的可視化調度編排工具出現了。
不管黑貓白貓,只要能逮住老鼠就是好貓。不管是哪種工具,只要具備高效運行、易於維護兩個特點,都是一款好工具。
歷史好文推薦