大數據系統之任務調度[1]

什么是任務調度系統?

A job scheduler is a computer application for controlling unattended background program execution of jobs (from wikipedia)

簡單來說就是你有很多任務, 彼此之間執行必須有一定順序構成一個DAG. 如下圖所示:

一個簡單的 DAG 示意圖

為什么需要任務調度系統


數據終究是要拿來計算的. 假設我們從小白開始搭建一套數據計算系統.

  • 數據計算第一階段:

    • 搭建了 Hadoop, 執行幾個 Hive 腳本統計數據
    • 為了簡單, 代碼直接寫到一個 HQL 文件中, 每天晚上 12 點執行, 計算前一天的運營數據
  • 大數據系統建設第二階段:

    • 數據需求開始增多, 你每天加班加點的開發新的計算, 放到同一個 HQL 文件中
  • 數據計算第三階段: 拆

問題:

  • 有一天你發現 HQL 文件已經一千多行了

    • 計算邏輯復雜, 牽一發而動全身
    • 時不時會有某個計算失敗, 全部計算重新執行很浪費時間
    • 老板看你忙不過來, 給你招了幾個小弟一起開發. 需要分拆任務
  • 大 HQL 文件根據邏輯拆成幾十個小的計算文件

  • 每個開發負責一塊業務的計算, 使用簡單的 bash 腳本按順序調用 hive -f 執行幾十個 HQL 文件進行計算

  • 小心安排幾十個計算的先后順序, 避免順序顛倒導致計算錯誤

  • 計算變成了一大串鞭炮, 挨個執行

  • 數據計算第四階段: 并發

問題:

  • 任務太多, 串行執行時間太長

  • 一個任務失敗, 后續任務全部等待, 效率很低

  • review 所有的計算任務, 找到可以并發執行的計算任務

  • 想辦法并發執行互不相干的一些任務, 計算任務僅僅依賴必須依賴的前置任務, 因此計算任務由一串鞭炮 組成了一個 DAG

因此, 我們對調度系統的需求如下:

  • 分解計算任務. 計算任務不單只有 Hive
  • 任務執行之間能夠互相依賴, 前置任務失敗, 后續依賴任務不執行
  • 盡可能的并行執行任務, 縮短執行時間
  • 定時觸發計算任務. daily/weekly/hourly 等
  • 任務失敗報警. 對于計算失敗的重要任務, 報警必不可少. 哪個數據工程師沒有半夜起來修復過失敗的計算任務?

從系統的角度來說, 調度系統應該包含以下幾個模塊:

  • Scheduler 模塊: 負責調度 DAG, 根據條件觸發任務執行
    • 按時啟動任務, 最好支持 Cron 表達式
    • 提供任務執行結果上報接口, Executor 模塊通過該接口告知 Scheduler 任務執行狀態. 接口不一定是 restful api, 數據庫可以作為接口
    • DAG 執行過程中, 根據已經成功的任務, 決定下一個滿足依賴條件的任務
    • 報警模塊. 任務執行失敗后, 根據配置的規則, 給響應的值班人員報警.
  • Executor 模塊: 負責根據 Scheduler 指令, 執行對應的任務
    • 獲取任務執行接口. Scheduler 通過接口通知 Executor 執行任務
    • 重試機制. 提供一定重試機制, 當任務因為網絡抖動等原因失敗時自動重試, 減少報警次數, 也就是減少數據工程師半夜爬起來的次數 LOL.
      • 重試次數不能太多, Fail Fast 在 Batch 計算業務中也同樣重要
      • 計算任務必須具備冪等性. 例如, 一個 Hive 計算寫成如下方式
-- test.tmp_test_table 用于存儲中間計算結果
CREATE TABLE test.tmp_test_table AS
SELECT data_date,
       count(*) AS cnt
FROM test_data
GROUP BY data_date;

是否具備冪等性? 回答是否定的. 因為一旦任務執行成功, 第二次執行時 test.tmp_test_table 已經存在, 任務會報錯 (Table Already Exists).
如何修改? 很簡單, 前面加一句 DROP TABLE IF EXISTS test.tmp_test_table 便可.

  • 代碼部署方式. Executor 要執行計算必須有代碼. 那如何獲取計算任務的代碼就是一個問題. 從擴展性來說, Executor 一定要支持分布式部署, 也就是一個 Scheduler 多個Executor.
    • 一種方式是, 將計算代碼部署到每個 Executor 節點.
      采用這種方式要求使用者必須有自動化部署, 因為計算代碼漏部署或者錯誤部署了一臺 Executor, 很有可能是測試階段由于計算任務沒有被分配到錯誤的 Executor 節點而真正夜間計算時錯誤的 Executor 節點被分配了計算任務導致失敗.
    • 改進的一種方案是: 代碼僅僅部署到 Scheduler 節點, 每次 Executor 拿到計算任務后, 通過 Scheduler 提供的 API 下載相應的計算代碼.
    • 思考: 以上兩種方案解決的僅僅是計算代碼的部署問題, 沒有考慮計算代碼依賴的 Library 的問題. 如果計算代碼中有外部依賴, 比如一些 Native 的 Library, 就需要在每個 Executor 上安裝所有計算代碼依賴的 Library. 最悲催的是: 如果兩個計算任務依賴的 Library 的版本不一樣就悲催了.
  • Web UI 模塊:
    • 查看 DAG,
    • 手動修復失敗任務
    • 看日志. 任務執行日志查看.
      • 不支持 Tail 功能
      • 不支持 Grep 功能, 基本上可以斷定是: 不好用!

調度系統的需求明確了, 甚至各個模塊的功能都想清楚了, 我們就可以像"選妃子"一樣, 看市面上有哪些可選的開源項目

開源調度系統


兩個系統都很不錯, 也能夠解決大多數需求. 網上針對兩個的比較也很多, 我就不班門弄斧了.


繼續上文中關于計算代碼依賴 Library 的思考

  • 計算任務代碼可以分成兩部分:
    • 調度配置文件. 前置任務, 啟動參數等
    • 計算代碼文件. 這才是會產生外部 Library 依賴的代碼.

因此, 如果我們把計算代碼裝進 Docker, 不就徹底解決了依賴問題?

-- EOF --

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,431評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,637評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,555評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,900評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,629評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,976評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,976評論 3 448
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,139評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,686評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,411評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,641評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,129評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,820評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,233評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,567評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,362評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,604評論 2 380

推薦閱讀更多精彩內容