1. 程式人生 > >深入大資料平臺心臟:餓了麼排程系統全解

深入大資料平臺心臟:餓了麼排程系統全解

隨著餓了麼在大資料應用的不斷深入,需要解決任務數量增長快、任務多樣化、任務關係複雜、任務執行效率低及任務失敗不可控等問題。

餓了麼大資料平臺現狀:每天完成大資料任務計算 54000+;節點叢集 85 臺。

開源解決方案

Ooize

Ooize 基於工作流排程引擎,是雅虎的開源專案,屬於 Java Web 應用程式。由 Oozie Client 和 Oozie Server 兩個元件構成。

Oozie Server 運行於 Java Servlet 容器(Tomcat)中的 Web 程式。工作流必須是一個有向無環圖,實際上 Oozie 就相當於 Hadoop 的一個客戶端。

當用戶需要執行多個關聯的 MR 任務時,只需要將 MR 執行順序寫入 workflow.xml,然後使用 Oozie 提交本次任務,Oozie 會託管此任務流。

AzKaban

AzKaban 是一套簡單的任務排程服務,是 Linkedin 的開源專案,開發語言為 Java,包括 Web Server、DB Server、Executor Server。

它用於在一個工作流內以一個特定的順序執行一組工作和流程,定義了一種 KV 檔案格式來建立任務之間的依賴關係,並提供一個易於使用的 Web 使用者介面維護和跟蹤你的工作流。

AirFlow

AirFlow 是一個編排、排程和監控 Workflow 的平臺,由 Airbnb 開源,現在在 Apache Software Foundation 孵化。

AirFlow 將 Workflow 編排為 tasks 組成的 DAGs,排程器在一組 Workers 上按照指定的依賴關係執行 tasks。

同時,AirFlow 提供了豐富的命令列工具和簡單易用的使用者介面以便使用者檢視和操作,並且 AirFlow 提供了監控和報警系統。

餓了麼排程系統特性

餓了麼排程系統特性如下:

  • 任務建立簡單,執行頻率支援 cron 表示式。
  • 任務拆分為多種任務型別,支援 19 種任務型別(計算、推送、抽取、檢測)。
  • 任務依賴配置簡單,支援不同週期匹配,提供推薦依賴,DAG VIEW 功能。
  • 排程與執行支援 HA,平滑釋出,宕機恢復,負載均衡,監控告警,故障排查,快速擴容,資源隔離。

支援任務型別:

  • 計算:Hive、Spark、PySpark、MR、Kylin。
  • 推送:MySQL 推送、HBase 推送、Redis 推送、Cassandra 推送、HiveToX 推送、MySQL 多推。
  • 抽取:資料抽取。
  • 檢測:Dal-slave 檢測、資料質量檢測、Edsink 檢測、抽取資料檢測、資料有效期、匯入匯出校驗。
  • 其他:郵件定時任務。

餓了麼排程系統整體架構

餓了麼排程系統整體架構包括如下 5 個部分:

  • Web 服務:主要提供任務建立、例項管理、任務依賴管理、Worker 控制、任務監控告警等。
  • 排程執行:主要由主備 Scheduler 和多個 Worker 節點組成,負責任務的排程與執行。
  • 基礎服務:提供了 Eless 自助釋出,ELK 故障排查,Huskar 配置中心,Etrace 埋點監控,DOG 告警等功能。
  • 底層服務:提供 Hive、Spark、Presto、Kylin、Hadoop 支援。
  • 公共設施:包括 MySQL、Redis、Zookeeper。

任務執行過程如上圖:

  • Web Service 提供的 API 建立任務和依賴關係,將任務資訊存入 MySQL。
  • Scheduler 定時生成第二天所有任務例項,並定時輪詢檢查並改變任務狀態為 Ready(是否到了執行時間,是否依賴已完成)。
  • Worker 啟動時註冊資訊至 Zookeeper,並定時上報機器狀態給 Scheduler。
  • Scheduler 的 ZkWorkerManager 監聽 Zookeeper,獲取 Worker 的註冊資訊。
  • 獲取 Ready 的任務,TaskPacketFactory 將任務構造成 TaskPacket,使用對應的 SubmitPolicy 投遞任務給 Worker。
  • Worker 通過 Thrift 接收任務,將任務解析成 InterpreterContext,交給對應的 Interpreter 執行,最終由 Docker 執行任務。
  • Docker 執行情況返回給 Worker,Worker 回撥給 Scheduler 將狀態寫入 MySQL。

餓了麼排程系統功能

任務依賴

任務依賴通過如下兩種方式配置:

推薦依賴:是通過任務執行完將表和列的資訊存入 MySQL,由餓了麼血緣系統根據表的關聯進行推薦。

手動依賴:則是人為通過介面設定表的依賴關係。依賴關係支援不同週期的任務依賴,偏移量支援表示式【,】【~】。

失敗快速自動重試

當任務執行失敗時,系統自動重新調起,預設重試 3 次;當任務投遞過程中,節點因資源緊張拒絕投遞,排程會根據負載均衡策略嘗試投遞另一臺機器。

自助故障排查

任務執行錯誤故障排查:節點提供 HTTP 服務,將任務執行的日誌通過 HTTP 返回給 Web Service 並展示到介面上,提供使用者自助排查。或者通過頁面上的連線訪問餓了麼錯誤分析平臺(Grace)自動分析。

任務非執行錯誤排查:任務排程和執行通過 Flume 將任務日誌進行收集,通過在 ELK 上搜索全域性 ID 即可檢視排程和執行情況。

監控告警

任務監控告警:根據使用者設定的告警規則和告警頻率,對任務執行超過完成時間和失敗的進行手機、郵件、釘釘告警。

故障監控和告警:排程和執行節點進行 Etrace 埋點,通過對接收、執行、回撥等關鍵點進行監測,當指標低於其他節點時間視窗平均值時,進行告警。

排程&執行

排程主備自動切換

排程器通過向 Zookeeper 註冊,並隨機選舉出 Leader 提供排程服務。非 Leader 服務監聽 Leader 狀態並 Wait,當 Leader 出現故障,立即切換為 Leader 角色提供服務。

宕機恢復、自我修復

當所有排程都宕機時,排程服務未恢復期間,Worker 執行節點回調會出現異常。

此時任務狀態會存入本地檔案資料庫,並定時重試回撥。當排程服務恢復時,任務狀態恢復正常。

當 Worker 執行節點宕機時,節點上的任務會處於執行中。當節點重啟時,Worker 會自我修復執行中的任務,將節點上未調起的任務重新調起,已經執行中的任務通過讀取 Docker 執行完寫入本地的狀態檔案進行恢復。

平滑釋出

當 Worker 節點進行版本升級時,執行中的任務進行自我修復,同上。

資源隔離和快速擴容

通過 Docker 限制每個任務的 Memory 和 CPU 資源使用;將依賴的底層服務打包成映象,擴容時便可以很方便的構建需要的環境。

節點故障維護

當節點發生故障或需要維護時,Worker 執行節點通過 Web 介面即可進行上線下線服務,下線後認為不再接收任務,但不影響節點上執行中的任務執行。

下面小編給大家介紹一下程式設計師的興趣學習圈,跟大咖零距離交流,更多學習教程群裡與您分享!
大資料學習qq群458345782
python學習qq群250933691
java學習qq群625241190