大數據調度系統學習


概述

為什么需要一個復雜的工作量調度器?
1、一個完整的數據分析系統通常都是由大量任務單元組成:shell腳本程序,java程序,mapreduce程序、
hive腳本等
2、各任務單元之間存在時間先后及前后依賴關系
3、為了很好地組織起這樣的復雜執行計划,需要一個工作流調度系統來調度執行

Apache DolphinScheduler 是一個分布式去中心化,中國人易觀開源的一個分布式易擴展的可視化
DAG 工作流任務調度系統。致力於解決數據處理流程中錯綜復雜的依賴關系,使調度系統在數據處理
流程中開箱即用。
特點:數據處理,可視化DAG,分布式,可擴展。

和其他調度系統的比較



Azkaban與Oozie對比

ooize 相比azkaban 是一個重量級的任務調度系統,功能全面,但配置使用也更復雜。如果可以不在意某些功能的缺失,輕量級調度器 azkaban 是很不錯的候選對象。
功能:
兩者均可以調度MapReduce,Hive,Java,腳本工作流任務等
兩者均可以定時執行和間隔執行工作流任務

工作流定義:
Azkaban使用Properties文件定義工作流
Oozie使用XML文件定義工作流

工作流傳參:
Azkaban支持直接傳參,例如${input}
Oozie支持參數和EL表達式,例如${fs:dirSize(myInputDir)} strust2(ONGL)

定時執行:
Azkaban的定時執行任務是基於時間的
Oozie的定時執行任務基於時間和輸入數據

資源管理:
Azkaban有較嚴格的權限控制,如用戶對工作流進行讀/寫/執行等操作
Oozie暫無嚴格的權限控制

工作流執行:
Azkaban有兩種運行模式,分別是solo server mode(executor server和web server部署在同一台
節點)和multi server mode(executor server和web server可以部署在不同節點)
Oozie作為工作流服務器運行,支持多用戶和多工作流

工作流管理:
Azkaban支持瀏覽器以及ajax方式操作工作流
Oozie支持命令行、HTTP REST、Java API、瀏覽器操作工作流

豐富特性

  • 以 DAG 圖的方式將 Task 按照任務的依賴關系關聯起來,可實時可視化監控任務的運行狀態
  • 支持豐富的任務類型:Shell、MapReduce、Spark、SQL(mysql、postgresql、hive、sparksql), Python, Sub_Process、Procedure 等
  • 支持工作流定時調度、依賴調度、手動調度、手動暫停/停止/恢復,同時支持失敗重試/告警、從指定節點恢復失敗、Kill 任務等操作
  • 支持工作流優先級、任務優先級及任務的故障轉移及任務超時告警/失敗
  • 支持工作流全局參數及節點自定義參數設置
  • 支持資源文件的在線上傳/下載,管理等,支持在線文件創建、編輯
  • 支持任務日志在線查看及滾動、在線下載日志等
  • 實現集群HA,通過Zookeeper實現Master集群和Worker集群去中心化
  • 支持對Master/Worker cpu load,memory,cpu在線查看
  • 支持工作流運行歷史樹形/甘特圖展示、支持任務狀態統計、流程狀態統計
  • 支持補數
  • 支持多租戶
  • 支持國際化
  • 系統支持基於cron 表達式的定時調度和手動調度。命令類型支持:啟動工作流、從當前節
    點開始執行、恢復被容錯的工作流、恢復暫停流程、從失敗節點開始執行、補數、定時、重跑、暫停、
    停止、恢復等待線程。其中 恢復被容錯的工作流 和 恢復等待線程 兩種命令類型是由調度內部控制使
    用,外部無法調用
  • 定時調度:系統采用 quartz 分布式調度器,並同時支持 cron 表達式可視化的生成

系統架構

基本流程如下:WEB把任務編排寫入MySQL,masterserver根據ZK選出一個master, 該master負責掃MySQL表,進行DAG拆分,然后進行任務調度把任務分發給 worker節點執行。

具體組件說明:
MasterServer:
MasterServer 采用分布式無中心設計理念,MasterServer 主要負責 DAG 任務切分、任務提交監控,
並同時監聽其它 MasterServer 和 WorkerServer 的健康狀態。 MasterServer 服務啟動時向
Zookeeper 注冊臨時節點,通過監聽 Zookeeper 臨時節點變化來進行容錯處理。 MasterServer 基於
netty 提供監聽服務。
該服務內主要包含:

  • Distributed Quartz 分布式調度組件,主要負責定時任務的啟停操作,當 quartz 調起任務后,
    Master 內部會有線程池具體負責處理任務的后續操作
  • MasterSchedulerThread 是一個掃描線程,定時掃描數據庫中的 command 表,根據不同的
    命令類型 進行不同的業務操作
  • MasterExecThread 主要是負責 DAG 任務切分、任務提交監控、各種不同命令類型的邏輯處理
  • MasterTaskExecThread 主要負責任務的持久化

WorkerServer:
WorkerServer 也采用分布式無中心設計理念,WorkerServer 主要負責任務的執行和提供日志服務。
WorkerServer 服務啟動時向 Zookeeper 注冊臨時節點,並維持心跳。Server 基於 netty 提供監聽服
務。
該服務包括:

  • FetchTaskThread 主要負責不斷從 Task Queue 中領取任務,並根據不同任務類型調用
    TaskScheduleThread 對應執行器。
  • LoggerServer 是一個 RPC 服務,提供日志分片查看、刷新和下載等功能
    ZooKeeper:
    主要是用作集群管理,HA,分布式鎖
    Task Queue:
    DS 也是采用 ZK 實現的, 隊列信息比較少,不大可能存在消息積壓的問題
    Alert:
    提供告警相關結課,告警信息存儲、查詢通知功能
    API:
    所有的操作API封裝在此

去中心化vs中心化
中心化思想如下圖:
master節點主要負責任務的分發, 均衡分發給下游 worker節點,不至於餓死或者飽死。同時維護和worker節點心跳,自動擴容摘除。類似於包工頭
worker就是具體干活的,維護和 master的心跳,以便接收到master分發的任務。

缺點:
master 單點效應

去中心化:

  • 所有角色平等,影響范圍小, 掛一台機器只會影響一部分
  • 不存在單點故障問題, 但是由於不存在管理者,每個節點都需要和其他所有節點通信才能拿到全部機器信息,分布式通信是不可靠的,所以大大增加實現難度
  • 真正去中心化的並不多見,大部分還是通過ZK 實現動態選主

ZK 分布式鎖的實現,主要是順序臨時節點的原子性,只有節點值最小的才獲取到鎖

容錯設計
通過ZK
其中 Master 監控其他 Master 和 Worker 的目錄,如果監聽到 remove 事件,則會根據具體的業務邏輯進行流程實例容錯或者任務實例容錯。

任務失敗重試

  • 任務失敗重試是任務級別的,是調度系統自動進行的,比如一個 Shell 任務設置重試次數為 3次,那么在 Shell 任務運行失敗后會自己再最多嘗試運行3次
  • 流程失敗恢復是流程級別的,是手動進行的,恢復是從只能從失敗的節點開始執行或從當前節點開始執行
  • 流程失敗重跑也是流程級別的,是手動進行的,重跑是從開始節點進行
    任務節點:
  • 一種是業務節點,這種節點都對應一個實際的腳本或者處理語句,比如 Shell 節點,MR 節點、Spark 節點、依賴節點等。(每一個 業務節點 都可以配置失敗重試的次數,當該任務節點失敗,會自動重試,直到成功或者超過配置的重試次數。)
  • 還有一種是邏輯節點,這種節點不做實際的腳本或語句處理,只是整個流程流轉的邏輯處理,比如子流程節等。(邏輯節點不支持失敗重試。但是邏輯節點里的任務支持重試。)

任務優先級設計

  • 按照不同流程實例優先級優先於同一個流程實例優先級優先於同一流程內任務優先級優先於同一流
    程內任務提交順序依次從高到低進行任務處理。
  • 具體實現是根據任務實例的json解析優先級,然后把流程實例優先級_流程實例id_任務優先級_任
    務id信息保存在 ZooKeeper 任務隊列中,當從任務隊列獲取的時候,通過字符串比較即可得出最
    需要優先執行的任務
  • 任務優先級有5項 HIGHEST、HIGH、MEDIUM、LOW、LOWEST

Logback 和 gRPC 實現日志訪問

統一日志查詢平台:
由於日志存儲節點和查詢節點不在一個地方,所以解決方案 要么是 日志存儲在ES中
要么通過 GRPC 通信遠程查詢日志信息
DS 是通過 netty遠程拉取日志查詢的

模塊

dolphinscheduler-alert 告警模塊,提供 AlertServer 服務。
dolphinscheduler-api web 應用模塊,提供 ApiServer 服務。
dolphinscheduler-common 通用的常量枚舉、工具類、數據結構或者基類
dolphinscheduler-dao 提供數據庫訪問等操作。
dolphinscheduler-remote 基於 netty 的客戶端、服務端
dolphinscheduler-server MasterServer 和 WorkerServer 服務
dolphinscheduler-service service模塊,包含 Quartz、Zookeeper、日志客戶端訪問服務,便於server 模塊和 api 模塊調用
dolphinscheduler-ui 前端模塊

功能點分析

具體功能分析

支持的任務節點類型:
Shell節點
子流程節點:就是把外部的某個工作流定義當做一個任務節點去執行
依賴節點: 就是依賴檢查節點。比如A流程依賴昨天的B流程執行成功,依賴節點會去檢查B流程在昨天是否有執行成功的實例。
存儲過程節點: 根據選擇的數據源,執行存儲過程
SQL節點:
非查詢SQL功能:編輯非查詢SQL任務信息,sql類型選擇非查詢
查詢SQL功能:編輯查詢SQL任務信息,sql類型選擇查詢,選擇表格或附件形式發送郵件到指定的收件人。
SPARK節點:通過SPARK節點,可以直接直接執行SPARK程序,對於spark節點,worker會使用spark-submit方式提交任務
MapReduce(MR)節點:使用MR節點,可以直接執行MR程序。對於mr節點,worker會使用hadoop jar方式提交任務
Python節點:使用python節點,可以直接執行python腳本,對於python節點,worker會使用python **方式提交任務。
Flink節點
http節點 :http請求URL
DATAX節點:
Conditions:Conditions是一個條件節點,根據上游任務運行狀態,判斷應該運行哪個下游任務。截止目前Conditions支持多個上游任務,但只支持兩個下游任務。當上游任務數超過一個時,可以通過且以及或操作符實現復雜上游依賴。就是根據上游節點的運行結果判定應該走
下流的那個節點。
Switch: Switch是一個條件判斷節點,依據全局變量的值和用戶所編寫的表達式判斷結果執行對應分支。

內置參數

基礎內置參數

變量名 聲明方式 含義
system.biz.date ${system.biz.date} 日常調度實例定時的定時時間前一天,格式為 yyyyMMdd,補數據時,該日期 +1
system.biz.curdate ${system.biz.curdate} 日常調度實例定時的定時時間,格式為 yyyyMMdd,補數據時,該日期 +1
system.datetime ${system.datetime} 日常調度實例定時的定時時間,格式為 yyyyMMddHHmmss,補數據時,該日期 +1
可以通過 ${system.biz.date} 引用系統內置參數

全局參數
作用域 : 在工作流定義頁面配置的參數,作用於該工作流中全部的任務; 如下定義作用域是在整個工作流中。

本地參數
作用域: 在任務定義頁面配置的參數,默認作用域僅限該任務,如果配置了參數傳遞則可將該參數作用到下游任務中。 如下就是該參數只作用於該任務。

參數傳遞
DolphinScheduler 提供參數間相互引用的能力,包括:本地參數引用全局參數、上下游參數傳遞。因為有引用的存在,就涉及當參數名相同時,參數的優先級問題


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM