記錄一下正在開發的一個任務調度系統,目的是為了解決大資料平臺下的任務管理、調度及監控。
定時觸發和依賴觸發。
系統模組:
JobManager:調度系統的Master,提供RPC服務,接收並處理JobClient/Web提交的所有操作;與中繼資料通訊,維護Job中繼資料;負責任務的統一配置維護、觸發、調度、監控;
JobMonitor: 監控正在運行的Job狀態、監控任務池、監控等待運行的Job;
JobWorker:調度系統的Slave,從任務池中獲取Job、負責啟動並收集Job的執行狀態,維護至中繼資料;使用Jetty提供任務運行日誌訪問服務。
JobClient/Web:調度系統用戶端類,前端介面提供給使用者,用作任務的配置、管理、監控等;
任務中繼資料:目前使用Mysql,保存Job的配置、依賴關係、運行歷史、資源配置、告警配置等;使用Mysql很不靠譜,任務多的時候會成瓶頸,必須遷移至HTTP://www.aliyun.com/zixun/ aggregation/14305.html">分散式存儲,Zookeeper也行;
系統特性:
分散式:容量和負載能力(JobWorker)可線性擴充;
高可用性:擁有主備Master,一旦主Master異常,備Master會接替主Master提供服務;
高容錯性:Master重新開機後,會將之前未完成的任務重新調度運行;
完善易用的Web使用者介面:用於使用者配置、提交、查詢、監控任務及任務的依賴關係;
支援任意類型的任務:除了Hadoop生態圈的MapReduce、Hive、Pig等,還支援其他任何語言開發的任務,如JAVA、Shell、Python、Perl、Spark等;
完整的日誌記錄:收集並記錄任務運行過程中產生的標準輸出和標準錯誤,提供Http訪問,使用者可通過訪問任務對應的日誌Url來方便的訪問任務運行日誌;
任務之間的靈活依賴:可將任意一個任務作為自己的父任務進行依賴觸發;
靈活多樣的告警規則:除了失敗告警,也支援任務超時未完成、任務超時未開始等告警規則;
難點:
依賴觸發時候,業務日期以及子孫任務的判斷,特別是手工運行任務,並且運行所有子孫任務的場景;
中繼資料的設計和存儲:剛開始想借鑒MapReduce的架構,中繼資料只做持久化,其他全通過RPC,在記憶體中進行,但複雜度太高。
任務的恢復:服務異常重啟之後,想將之前所有的任務恢復到原來的狀態。
JobWorker之間的共用存儲:暫時將任務程式放在HDFS上,JobWorker在運行任務時候從HDFS獲取到本地。
任務超時告警:當一個任務超過某一時間還沒開始或者成功結束時觸發告警,此類告警放到Quartz中去觸發。
JobWorker可以運行在任意機器上,只需要能訪問中繼資料,一些不好遷移的業務程式可以將JobWorker運行在其機器上,添加任務時候需指定資源,這樣,在分配任務的時候只會分配到指定的資源上去。
不同的業務需要用不同的使用者去執行:將業務類型和使用者名綁定。
KILL任務:對於Hadoop和Hive任務,不能僅僅銷毀執行進程,需要從日誌中解析Hadoop jobid,執行hadoop kill命令。
原文連結:HTTP://superlxw1234.iteye.com/blog/2147630