工作流任務調度系統:Apache DolphinScheduler

官網     |     GitHub        

目錄



1 概述

Apache DolphinScheduler(目前處在孵化階段)是一個分佈式、去中心化、易擴展的可視化DAG工作流任務調度系統,其致力於解決數據處理流程中錯綜複雜的依賴關係,使調度系統在數據處理流程中開箱即用。

DolphinScheduler是今年(2019年)中國易觀公司開源的一個調度系統,在今年美國時間2019年8月29號,易觀開源的分佈式任務調度引擎DolphinScheduler(原EasyScheduler)正式通過頂級開源組織Apache基金會的投票決議,根據Apache基金會郵件列表顯示,在包含11個約束性投票(binding votes)和2個無約束性投票(non-binding votes)的投票全部持贊同意見,無棄權票和反對票,投票順利通過,這樣便以全票通過的優秀表現正式成爲了Apache孵化器項目!

1.1 背景

在2017年,易觀在運營自己6.8Pb大小、6.02億月活、每天近萬個調度任務的大數據平臺時,受到ETL複雜的依賴關係、平臺易用性、可維護性及二次開發等方面掣肘,易觀的技術團隊渴望找到一個具有以下功能的數據調度工具:

  • 易於使用,開發人員可以通過非常簡單的拖拽操作構建ETL過程。不僅對於ETL開發人員,無法編寫代碼的人也可以使用此工具進行ETL操作,例如系統管理員和分析師;
  • 解決“複雜任務依賴”問題,並且可以實時監視ETL運行狀態;
  • 支持多租戶;
  • 支持許多任務類型:Shell,MR,Spark,SQL(mysql,postgresql,hive,sparksql),Python,Sub_Process,Procedure等;
  • 支持HA和線性可擴展性。

易觀技術團隊意識到現有開源項目沒有能夠達到他們要求的,因此決定自行開發這個工具。他們在2017年底設計了DolphinScheduler的主要架構;2018年5月完成第一個內部使用版本,後來又迭代了幾個內部版本後,系統逐漸穩定下來。

這裏介紹一下DolphinScheduler易觀技術團隊,他們是一支來自百度、阿里、百分點、Ptmind、熱雲等團隊的“數據極客”,秉持易觀“讓數據能力平民化”的初心,積極擁抱開源,曾貢獻過Presto Hbase Connector, Presto Kudu Connector等令開發者稱讚的項目。這次他們在公司的支持下,積極地將自己開發的調度工具推動開源,旨在回饋開源的同時,助力打造一個更爲強大的開源生態。如果躍躍欲試的想去貢獻代碼的,貢獻流程可以參考這篇博客:分佈式任務調度EasyScheduler貢獻代碼流程

團隊在2019年3月初,小範圍(10多家公司)開放了DS的種子用戶試用,得到了非常正能量的反饋,在4月初的正式對外開放源碼後,很快就獲得了許多開發人員的關注興趣,目前github上的star現在已超過1700個,參與開發和使用的公司包括嘀嗒出行、雪球、鳳凰金融、水滴互助、華潤萬家等,更詳細的可以查看:Wanted: Who is using DolphinScheduler #57

1.2 特點

DolphinScheduler提供了許多易於使用的功能,可加快數據ETL工作開發流程的效率。其主要特點如下:

  • 通過拖拽以DAG 圖的方式將 Task 按照任務的依賴關係關聯起來,可實時可視化監控任務的運行狀態;
  • 支持豐富的任務類型;
  • 支持工作流定時調度、依賴調度、手動調度、手動暫停/停止/恢復,同時支持失敗重試/告警、從指定節點恢復失敗、Kill 任務等操作;
  • 支持工作流全局參數及節點自定義參數設置;
  • 支持集羣HA,通過 Zookeeper實現 Master 集羣和 Worker 集羣去中心化
  • 支持工作流運行歷史樹形/甘特圖展示、支持任務狀態統計、流程狀態統計;
  • 支持補數,並行或串行回填數據。

2 系統架構

2.1 名詞解釋

  • 流程定義:通過拖拽任務節點並建立任務節點的關聯所形成的可視化DAG
  • 流程實例:流程實例是流程定義的實例化,可以通過手動啓動或定時調度生成,流程定義每運行一次,產生一個流程實例
  • 任務實例:任務實例是流程定義中任務節點的實例化,標識着具體的任務執行狀態
  • 任務類型: 目前支持有SHELL、SQL、SUB_PROCESS(子流程)、PROCEDURE、MR、SPARK、PYTHON、DEPENDENT(依賴),同時計劃支持動態插件擴展,注意:其中子 SUB_PROCESS 也是一個單獨的流程定義,是可以單獨啓動執行的
  • 調度方式: 系統支持基於cron表達式的定時調度和手動調度。命令類型支持:啓動工作流、從當前節點開始執行、恢復被容錯的工作流、恢復暫停流程、從失敗節點開始執行、補數、定時、重跑、暫停、停止、恢復等待線程。其中 恢復被容錯的工作流 和 恢復等待線程 兩種命令類型是由調度內部控制使用,外部無法調用
  • 定時調度:系統採用 quartz 分佈式調度器,並同時支持cron表達式可視化的生成
  • 依賴:系統不單單支持 DAG 簡單的前驅和後繼節點之間的依賴,同時還提供任務依賴節點,支持流程間的自定義任務依賴
  • 優先級 :支持流程實例和任務實例的優先級,如果流程實例和任務實例的優先級不設置,則默認是先進先出
  • 郵件告警:支持 SQL任務 查詢結果郵件發送,流程實例運行結果郵件告警及容錯告警通知
  • 失敗策略:對於並行運行的任務,如果有任務失敗,提供兩種失敗策略處理方式,繼續是指不管並行運行任務的狀態,直到流程失敗結束。結束是指一旦發現失敗任務,則同時Kill掉正在運行的並行任務,流程失敗結束
  • 補數:補歷史數據,支持區間並行和串行兩種補數方式

2.2 架構

在這裏插入圖片描述

關於更詳細的系統架構設計可以查看官方提供的劉小春(xiaochun.liu)一篇博客 DolphinScheduler系統架構設計


3 部署

3.1 後端部署

後端有2種部署方式,分別爲自動化部署和編譯源碼部署。下面主要介紹下載編譯後的二進制包一鍵自動化部署的方式完成DolphinScheduler後端部署。

3.1.1 基礎軟件安裝

  • Mysql (5.5+) : 必裝
  • JDK (1.8+) : 必裝
  • ZooKeeper(3.4.6+) :必裝
  • Hadoop(2.6+) :選裝, 如果需要使用到資源上傳功能,MapReduce任務提交則需要配置Hadoop(上傳的資源文件目前保存在Hdfs上)
  • Hive(1.2.1) : 選裝,hive任務提交需要安裝
  • Spark(1.x,2.x) : 選裝,Spark任務提交需要安裝
  • PostgreSQL(8.2.15+) : 選裝,PostgreSQL PostgreSQL存儲過程需要安裝

注意:EasyScheduler本身不依賴Hadoop、Hive、Spark、PostgreSQL,僅是會調用他們的Client,用於對應任務的運行。

3.1.2 創建部署用戶

在所有需要部署調度的機器上創建部署用戶(本次以node2、node3節點爲例),因爲worker服務是以 sudo -u {linux-user} 方式來執行作業,所以部署用戶需要有 sudo 權限,而且是免密的。

# 1 創建用戶
useradd escheduler

# 2 設置 escheduler 用戶密碼
passwd escheduler

# 3 賦予sudo權限。編輯系統 sudoers 文件
# 如果沒有編輯權限,以root用戶登錄,賦予w權限
# chmod 640 /etc/sudoers
vi /etc/sudoers

# 大概在100行,在root下添加如下
escheduler  ALL=(ALL)       NOPASSWD: NOPASSWD: ALL

# 並且需要註釋掉 Default requiretty 一行。如果有則註釋,沒有沒有跳過
#Default requiretty

########### end ############

# 4 切換到 escheduler 用戶
su escheduler

3.1.3 下載並解壓

# 1 創建安裝目錄
sudo mkdir /opt/DolphinScheduler

# 2 將DolphinScheduler賦予給escheduler用戶
sudo chown -R escheduler:escheduler /opt/DolphinScheduler

# 3 下載後端。簡稱escheduler-backend
cd /opt/DolphinScheduler
wget https://github.com/apache/incubator-dolphinscheduler/releases/download/1.1.0/escheduler-1.1.0-backend.tar.gz

# 4 解壓
mkdir escheduler-backend
mkdir escheduler
tar -zxf escheduler-1.1.0-backend.tar.gz -C escheduler
cd escheduler/

# 5 目錄介紹
 [escheduler@node2 escheduler]$ tree -L 1
 .
 ├── bin           # 基礎服務啓動腳本
 ├── conf          # 項目配置文件
 ├── install.sh    # 一鍵部署腳本
 ├── lib           # 項目依賴jar包,包括各個模塊jar和第三方jar
 ├── script        # 集羣啓動、停止和服務監控啓停腳本
 └── sql           # 項目依賴sql文件
 5 directories, 1 file

3.1.4 針對escheduler用戶ssh免密配置

# 1 配置SSH免密
# 1.1 node2 節點執行
#   有提示直接回車
ssh-keygen -t rsa
# 拷貝到node2和node3。提示輸入密碼時,輸入 escheduler 用戶的密碼
ssh-copy-id -i ~/.ssh/id_rsa.pub escheduler@node2
ssh-copy-id -i ~/.ssh/id_rsa.pub escheduler@node3

# 1.2 node3 節點執行
#   有提示直接回車
ssh-keygen -t rsa
# 拷貝到node2和node3。提示輸入密碼時,輸入 escheduler 用戶的密碼
ssh-copy-id -i ~/.ssh/id_rsa.pub escheduler@node2
ssh-copy-id -i ~/.ssh/id_rsa.pub escheduler@node3

3.1.5 數據庫初始化

執行以下命令創建數據庫和賬號

CREATE DATABASE escheduler DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
-- 設置數據用戶escheduler的訪問密碼爲 escheduler,並且不對訪問的ip做限制
-- 測試環境將訪問設置爲所有,如果是生產,可以限制只能子網段的ip才能訪問('198.168.33.%')
GRANT ALL PRIVILEGES ON escheduler.* TO 'escheduler'@'%' IDENTIFIED BY 'escheduler';
flush privileges;

創建表和導入基礎數據 修改vim /opt/DolphinScheduler/escheduler/conf/dao/data_source.properties中的下列屬性

# 大概在第 4 行修改MySQL數據庫的url
 spring.datasource.url=jdbc:mysql://node1:3306/escheduler?characterEncoding=UTF-8
# 用戶名。
spring.datasource.username=escheduler
# 密碼。填入上一步IDENTIFIED BY 後面設置的密碼
spring.datasource.password=escheduler

執行創建表和導入基礎數據腳本

# 前面已進入/opt/DolphinScheduler/escheduler-backend目錄下,然後執行數據初始化腳本
# 最後看到  create escheduler success 表示數據庫初始化成功
sh ./script/create_escheduler.sh

3.1.6 修改部署目錄權限及運行參數

# 1 修改conf/env/目錄下的 .escheduler_env.sh 環境變量
vim conf/env/.escheduler_env.sh

# 將對應的修改爲自己的組件或框架的路徑
export HADOOP_HOME=/opt/hadoop-3.1.2
export HADOOP_CONF_DIR=/opt/hadoop-3.1.2/etc/hadoop
export SPARK_HOME1=/opt/spark-2.3.4-bin-hadoop2.7
#export SPARK_HOME2=/opt/soft/spark2
#export PYTHON_HOME=/opt/soft/python
export JAVA_HOME=/usr/local/zulu8/
export HIVE_HOME=/opt/apache-hive-3.1.1-bin
#export PATH=$HADOOP_HOME/bin:$SPARK_HOME1/bin:$SPARK_HOME2/bin:$PYTHON_HOME:$JAVA_HOME/bin:$HIVE_HOME/bin:$PATH
export PATH=$HADOOP_HOME/bin:$SPARK_HOME1/bin:$JAVA_HOME/bin:$HIVE_HOME/bin:$PATH

# ==========
# CDH 版
# ==========
#export HADOOP_HOME=/opt/cloudera/parcels/CDH/lib/hadoop
#export HADOOP_CONF_DIR=/etc/hadoop/conf.cloudera.yarn
#export SPARK_HOME1=/opt/cloudera/parcels/CDH/lib/spark
##export SPARK_HOME2=/opt/soft/spark2
##export PYTHON_HOME=/opt/soft/python
#export JAVA_HOME=/usr/local/zulu8/
#export HIVE_HOME=/opt/cloudera/parcels/CDH/lib/hive
##export PATH=$HADOOP_HOME/bin:$SPARK_HOME1/bin:$SPARK_HOME2/bin:$PYTHON_HOME:$JAVA_HOME/bin:$HIVE_HOME/bin:$PATH
#export PATH=$HADOOP_HOME/bin:$SPARK_HOME1/bin:$JAVA_HOME/bin:$HIVE_HOME/bin:$PATH

修改 install.sh中的各參數,替換成自身業務所需的值,這裏只列出了重要的修改項,其它默認不用改即可。

# mysql配置
# mysql 地址,端口
mysqlHost="192.168.33.3:3306"

# mysql 數據庫名稱
mysqlDb="escheduler"
 
# mysql 用戶名
mysqlUserName="escheduler"

# mysql 密碼
# 注意:如果有特殊字符,請用 \ 轉移符進行轉移
mysqlPassword="escheduler"

# conf/config/install_config.conf配置
# 注意:安裝路徑,不要當前路徑(pwd)一樣。一鍵部署腳本分發到其它節點時的安裝路徑
installPath="/opt/DolphinScheduler/escheduler-backend"

# 部署用戶
# 注意:部署用戶需要有sudo權限及操作hdfs的權限,如果開啓hdfs,根目錄需要自行創建
deployUser="escheduler"

# zk集羣
zkQuorum="192.168.33.3:2181,192.168.33.6:2181,192.168.33.9:2181"

# 安裝hosts
# 注意:安裝調度的機器hostname列表,如果是僞分佈式,則只需寫一個僞分佈式hostname即可
ips="192.168.33.6,192.168.33.9"

# conf/config/run_config.conf配置
# 運行Master的機器
# 注意:部署master的機器hostname列表
masters="192.168.33.6"

# 運行Worker的機器
# 注意:部署worker的機器hostname列表
workers="192.168.33.6,192.168.33.9"

# 運行Alert的機器
# 注意:部署alert server的機器hostname列表
alertServer="192.168.33.6"

# 運行Api的機器
# 注意:部署api server的機器hostname列表
apiServers="192.168.33.6"

# 用到郵箱發送郵件時務必配置上郵件服務,否則執行結果發送時會提示失敗
# cn.escheduler.server.worker.runner.TaskScheduleThread:[249] - task escheduler # failure : send mail failed!
java.lang.RuntimeException: send mail failed!
# alert配置
# 郵件協議,默認是SMTP郵件協議
mailProtocol="SMTP"
# 郵件服務host。以網易郵箱爲例。QQ郵箱的服務爲 smtp.qq.com
mailServerHost="smtp.163.com"
# 郵件服務端口。SSL協議端口 465/994,非SSL協議端口 25
mailServerPort="465"
# 發送人。
# 網易郵箱在 客戶端授權密碼 獲取,具體可以看下圖
mailSender="*******[email protected]"
# 發送人密碼
mailPassword="yore***"

# 下載Excel路徑
xlsFilePath="/home/escheduler/xls"

#是否啓動監控自啓動腳本
# 開關變量,在1.0.3版本中增加,控制是否啓動自啓動腳本(監控master,worker狀態,如果掉線會自動啓動) 
# 默認值爲"false"表示不啓動自啓動腳本,如果需要啓動改爲"true"
monitorServerState="true"

# 資源中心上傳選擇存儲方式:HDFS,S3,NONE
resUploadStartupType="HDFS"

# 如果resUploadStartupType爲HDFS,defaultFS寫namenode地址,支持HA,需要將core-site.xml和hdfs-site.xml放到conf目錄下
# 如果是S3,則寫S3地址,比如說:s3a://escheduler,注意,一定要創建根目錄/escheduler
defaultFS="hdfs://192.168.33.3:8020"

# resourcemanager HA配置,如果是單resourcemanager,這裏爲yarnHaIps=""
yarnHaIps="192.168.33.3"

# 如果是單 resourcemanager,只需要配置一個主機名稱,如果是resourcemanager HA,則默認配置就好
singleYarnIp="192.168.33.3"

# common 配置
# 程序路徑
programPath="/opt/DolphinScheduler/escheduler-backend"

#下載路徑
downloadPath="/tmp/escheduler/download"

# 任務執行路徑
execPath="/tmp/escheduler/exec"

# SHELL環境變量路徑
shellEnvPath="$installPath/conf/env/.escheduler_env.sh"

# 資源文件的後綴
resSuffixs="txt,log,sh,conf,cfg,py,java,sql,hql,xml"

# api 配置
# api 服務端口
apiServerPort="12345"

如果使用hdfs相關功能,需要拷貝hdfs-site.xml和core-site.xml到conf目錄下

cp $HADOOP_HOME/etc/hadoop/hdfs-site.xml conf/
cp $HADOOP_HOME/etc/hadoop/core-site.xml conf/

網易雲郵箱服務客戶端用戶名和密碼獲取,開啓客戶端授權碼,並獲取。
網易雲郵箱服務設置

如果 DolphinScheduler 已經安裝,則可以通過設置部署的後端服務下的conf/alert.properties文件

#alert type is EMAIL/SMS
alert.type=EMAIL

# mail server configuration
mail.protocol=SMTP
# 以網易郵箱爲例
mail.server.host=smtp.163.com
#  SSL協議端口 465/994,非SSL協議端口 25
mail.server.port=465
mail.sender=*******[email protected]
mail.passwd=yore***

# TLS
mail.smtp.starttls.enable=false
# SSL
mail.smtp.ssl.enable=true

#xls.file.path=/home/escheduler/xls
xls.file.path=/home/escheduler/xls

# Enterprise WeChat configuration
enterprise.wechat.corp.id=xxxxxxxxxx
enterprise.wechat.secret=xxxxxxxxxx
enterprise.wechat.agent.id=xxxxxxxxxx
enterprise.wechat.users=xxxxx,xxxxx
enterprise.wechat.token.url=https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$corpId&corpsecret=$secret
enterprise.wechat.push.url=https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$token
enterprise.wechat.team.send.msg={\"toparty\":\"$toParty\",\"agentid\":\"$agentId\",\"msgtype\":\"text\",\"text\":{\"content\":\"$msg\"},\"safe\":\"0\"}
enterprise.wechat.user.send.msg={\"touser\":\"$toUser\",\"agentid\":\"$agentId\",\"msgtype\":\"markdown\",\"markdown\":{\"content\":\"$msg\"}}

3.1.7 執行腳本一鍵部署

# 1 一鍵部署並啓動
sh install.sh

# 2 查看日誌
[escheduler@node2 escheduler-backend]$ tree /opt/DolphinScheduler/escheduler-backend/logs
/opt/DolphinScheduler/escheduler-backend/logs
├── escheduler-alert.log
├── escheduler-alert-server-node-b.test.com.out
├── escheduler-alert-server.pid
├── escheduler-api-server-node-b.test.com.out
├── escheduler-api-server.log
├── escheduler-api-server.pid
├── escheduler-logger-server-node-b.test.com.out
├── escheduler-logger-server.pid
├── escheduler-master.log
├── escheduler-master-server-node-b.test.com.out
├── escheduler-master-server.pid
├── escheduler-worker.log
├── escheduler-worker-server-node-b.test.com.out
├── escheduler-worker-server.pid
└── {processDefinitionId}
    └── {processInstanceId}
        └── {taskInstanceId}.log


# 3 查看Java進程
# 3.1 node2
# jps -l | grep escheduler
[escheduler@node2 escheduler-backend]$ jps
31651 WorkerServer              # worker服務
31784 ApiApplicationServer      # api服務
31609 MasterServer              # master服務
31743 AlertServer               # alert服務
31695 LoggerServer              # logger服務

# 3.2 node3
[escheduler@cdh3 DolphinScheduler]$ jps
26678 WorkerServer
26718 LoggerServer

錯誤1:如果查看/opt/DolphinScheduler/escheduler-backend/logs/escheduler-api-server-*.out日誌報如下錯誤

nohup: failed to run command ‘/bin/java’: No such file or directory

解決:將JAVA_HOME/bin下的java軟連接到/bin下。(每個dolphinscheduler節點都執行)

ln -s $JAVA_HOME/bin/java /bin/java

3.1.8 服務進程的說明

由前面我們可以看到,後端服務正常啓動後,共有 5 個進程:WorkerServerApiApplicationServerMasterServerAlertServerLoggerServer 。另外還有一個 UI,具體說明如下:

服務 說明
MasterServer 主要負責 DAG 的切分和任務狀態的監控
WorkerServer/
LoggerServer
主要負責任務的提交、執行和任務狀態的更新。LoggerServer用於Rest Api通過 RPC 查看日誌
ApiServer 提供Rest Api服務,供UI進行調用
AlertServer 提供告警服務
UI 前端頁面展示

3.1.9 dolphinscheduler後端服務啓停

# 啓動
/opt/DolphinScheduler/escheduler-backend/script/start_all.sh

# 停止
/opt/DolphinScheduler/escheduler-backend/script/stop_all.sh

3.2 前端部署

前端有3種部署方式,分別爲自動化部署,手動部署和編譯源碼部署。這裏主要使用自動化腳本方式部署DolphinScheduler前端服務。

3.2.1 下載並解壓

# 1 下載 UI 前端。簡稱escheduler-ui
# 在node2節點下的 /opt/DolphinScheduler 
wget https://github.com/apache/incubator-dolphinscheduler/releases/download/1.1.0/escheduler-1.1.0-ui.tar.gz

# 2 解壓
mkdir escheduler-ui
tar -zxf escheduler-1.1.0-ui.tar.gz -C escheduler-ui
cd escheduler-ui

3.2.2 執行自動化部署腳本

執行自動化部署腳本。腳本會提示一些參數,根據提示完成安裝。

[escheduler@cdh2 escheduler-ui]$ sudo ./install-escheduler-ui.sh
歡迎使用easy scheduler前端部署腳本,目前前端部署腳本僅支持CentOS,Ubuntu
請在 escheduler-ui 目錄下執行
linux
請輸入nginx代理端口,不輸入,則默認8888 :8888
請輸入api server代理ip,必須輸入,例如:192.168.xx.xx :192.168.33.6
請輸入api server代理端口,不輸入,則默認12345 :12345
=================================================
        1.CentOS6安裝
        2.CentOS7安裝
        3.Ubuntu安裝
        4.退出
=================================================
請輸入安裝編號(1|2|3|4):2

…… 

Complete!
port option is needed for add
FirewallD is not running
setenforce: SELinux is disabled
請瀏覽器訪問:http://192.168.33.6:8888

使用自動化部署腳本會檢查系統環境是否安裝了Nginx,如果沒有安裝則會通過網絡自動下載Nginx包安裝,通過引導設置後的Nginx配置文件爲/etc/nginx/conf.d/escheduler.conf。但生產環境一般法法訪問外網,此時可以通過手動離線安裝Nginx,然後進行一些配置即可。

# 1 下載 Nginx 離線安裝包
# 例如下載 Cento7 CPU指令爲 x86版本的 
wget http://nginx.org/packages/mainline/centos/7/x86_64/RPMS/nginx-1.17.6-1.el7.ngx.x86_64.rpm

# 2 安裝
rpm -ivh nginx-1.17.6-1.el7.ngx.x86_64.rpm

下面在手動再Nginx中添加一個DolphinSchedule 服務配置。因爲在 /etc/nginx/nginx.conf(Nginx默認加載的配置文件)中有include /etc/nginx/conf.d/*.conf ;,所以我們可以在 /etc/nginx/conf.d/ 下創建一個 conf後綴的配置文件,配置文件的文件名隨意,例如叫 escheduler.conf。這裏需要特別注意的是在 /etc/nginx/nginx.conf 配置文件中前面有一個配置 user nginx 如果啓動Nginx的用戶不是 nginx,一定要修改爲啓動Nginx的用戶,否則代理的服務會報 403 的錯誤。這裏我們在/etc/nginx/conf.d/escheduler.conf配置如下內容,重點在 server 中配置 listen(DolphinSchedule Web UI 的端口)、**root **(解壓的escheduler-ui 中的 dist 路徑 )、proxy_pass (DolphinSchedule後臺接口的地址)等信息。最後重啓Nginx執行命令 systemctl restart nginx

server {
    listen       8888;  # 訪問端口
    server_name  localhost;
    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;
    location / {
        root    /opt/DolphinScheduler/escheduler-ui/dist; # 上面前端解壓的dist目錄地址(自行修改)
        index  index.html index.html;
    }
    location /escheduler {
        proxy_pass http://192.168.33.6:12345; # 接口地址(自行修改)
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header x_real_ipP $remote_addr;
        proxy_set_header remote_addr $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_http_version 1.1;
        proxy_connect_timeout 4s;
        proxy_read_timeout 30s;
        proxy_send_timeout 12s;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
    #error_page  404              /404.html;
    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

問題1:上傳文件大小限制
編輯配置文件 vim /etc/nginx/nginx.conf

# 更改上傳大小
client_max_body_size 1024m

3.2.3 dolphinscheduler前端服務啓停

# 1 啓動
systemctl start nginx

# 2 狀態
systemctl status nginx

# 3 停止
#nginx -s stop
systemctl stop nginx

4 快速開始

瀏覽器訪問http://192.168.33.6:8888,如下圖所示。
在這裏插入圖片描述
在上述登陸頁面默認的賬戶的用戶名爲 admin 密碼爲escheduler123,這個賬戶也是系統默認的管理員賬戶,登陸成功後可以修改密碼。成功登陸有主頁面如下所示
在這裏插入圖片描述

創建一個隊列。隊列管理 -> 創建隊列 -> 輸入名稱和隊列值 -> 提交。
在這裏插入圖片描述

創建租戶。租戶管理 -> 創建租戶 -> 輸入租戶編碼、租戶名稱和隊列值 -> 提交。
在這裏插入圖片描述

創建普通用戶。用戶管理 -> 創建用戶 -> 輸入用戶名稱、密碼、租戶名和郵箱,手機號選填 -> 提交。
在這裏插入圖片描述

創建警告組。警告組管理 -> 創建警告組 -> 輸入組名稱、組類型(郵件、短信)-> 提交。
在這裏插入圖片描述
使用普通用戶登錄(用戶名和密碼都是demo)。點擊右上角用戶名“退出”,重新使用普通用戶登錄。登陸成功的首頁如下。
在這裏插入圖片描述

創建一個項目。點擊頁面頭部的項目管理,進入項目頁面,再點擊創建項目,創建一個DolphinScheduler任務調度項目,在彈出的框中輸入項目名稱和描述,例如這裏創建一個hello_dolphinScheduler名稱的項目,最後點擊提交。
在這裏插入圖片描述

項目創建完畢後,在項目管理頁面點擊我們創建的項目,進入該項目的管理頁面。點擊工作流定義 -> 創建工作流 -> 在左側工具欄可以選擇(SHELL、USB_PROCESS、PROCEDURE、SQL、SPARK、MapReduce、PYTHON、DEPENDENT)。拖拽SHELL節點到畫布,新增一個Shell任務,填寫 節點名稱描述腳本 字段;選擇 任務優先級 ,級別高的任務在執行隊列中會優先執行,相同優先級的任務按照先進先出的順序執行;超時告警, 填寫 超時時長 ,當任務執行時間超過超時時長可以告警並且超時失敗。(注意:這裏的節點不是機器的節點,而應該是工作流的節點)
在這裏插入圖片描述

確認修改完畢後,點擊保存,此時設置DAG圖名稱,選擇組租戶,最後添加。
在這裏插入圖片描述

未上線狀態的工作流定義可以編輯,但是不可以運行,所以要執行工作流,需要先上線工作流
在這裏插入圖片描述
點擊”運行“,執行工作流。運行參數說明:

  • 失敗策略:當某一個任務節點執行失敗時,其他並行的任務節點需要執行的策略。”繼續“表示:其他任務節點正常執行,”結束“表示:終止所有正在執行的任務,並終止整個流程。
  • 通知策略:當流程結束,根據流程狀態發送流程執行信息通知郵件。
  • 流程優先級:流程運行的優先級,分五個等級:最高(HIGHEST),高(HIGH),中(MEDIUM),低(LOW),最低(LOWEST)。級別高的流程在執行隊列中會優先執行,相同優先級的流程按照先進先出的順序執行。
  • worker分組: 這個流程只能在指定的機器組裏執行。默認是Default,可以在任一worker上執行。
  • 通知組: 當流程結束,或者發生容錯時,會發送流程信息郵件到通知組裏所有成員。
  • 收件人:輸入郵箱後按回車鍵保存。當流程結束、發生容錯時,會發送告警郵件到收件人列表。
  • 抄送人:輸入郵箱後按回車鍵保存。當流程結束、發生容錯時,會抄送告警郵件到抄送人列表。
    在這裏插入圖片描述

點擊任務實例可以查看每個任務的列表信息,點擊操作欄,可以看到任務執行的日誌信息。
在這裏插入圖片描述

5 Worker分組和數據源添加

worker分組,提供了一種讓任務在指定的worker上運行的機制。管理員創建worker分組,在任務節點和運行參數中設置中可以指定該任務運行的worker分組,如果指定的分組被刪除或者沒有指定分組,則該任務會在任一worker上運行。worker分組內多個ip地址(不能寫別名),以英文逗號分隔。

用管理員用戶(admin)登陸Web頁面,點擊 安全中心 -> Worker分組管理,如下圖所示。
分組管理

創建Worker分組。填寫組名稱和IP,IP可以是多個,用英文逗號分割即可。
設置IP的分組
例如下圖,我們將Worker的IP分爲了兩組。
 Worker 分組

6 添加數據源

腳本(一般是SQL腳本)執行時可能會用到一些數據源,例如MySQL、PostgreSQL、Hive、Impala、Spark、ClickHouse、Oracle、SQL Server,通過添加數據源在DolphinScheduler頁面編寫Job時直接選擇,不用再指定驅動、連接、用戶名和密碼等信息,可以快速創建一個SQL腳本的工作流Job,同時這個數據源時用戶隔離的,每個用戶添加的數據源相互獨立(admin用戶除外,管理員用戶可以看到所有用戶添加的數據源)。

下面我們以Impala爲例,選擇頁面頭部的 數據源中心 -> 添加數據源,會彈出下圖 編輯數據源 彈窗,主要填寫如下幾項。因爲Impala沒有設置密碼,用戶爲必填可以任意添加一個,在jdbc連接參數中必須添加 {"auth":"noSasl"}參數,否則會一直等待確認認證。
在這裏插入圖片描述
其它數據源類似,例如我們添加如下幾個數據源,後面會用到ClickHouse(詳見我的另一篇博客 ClickHouse的安裝(含集羣方式)和使用)。
在這裏插入圖片描述

7 實例

在項目管理下,點擊工作流定義,在工具欄處選擇最後一行的DEPENDENT定義一個帶依賴的工作流Job,拖動到編輯面板,設置task的節點名爲cdh2-task1,在 Worker分組 中選擇執行的Worker節點爲cdh2,編輯完這個Task後選擇 確認添加。選擇執行的Worker分組名,這裏選擇前面設置的cdh2組,確認添加,如下圖所示。同樣的方式設置第二個依賴Task,將其Worker分組設置到cdh3節點,並添加依賴爲
在這裏插入圖片描述
接下來設置兩個Shell執行腳本,cdh2-task11上執行task11,主要是在cdh2上執行一個hostname命令,打印執行節點的HostName。同樣的方式,在依賴節點cdh3-task21上設置在cdh3執行,也是執行hostname命令。最後再在依賴節點cdh3-task21上添加一個SQL腳本,查詢我們的豆瓣電影數據,具體操作如下

  • 在工具欄拖拽添加一個SQL腳本Task節點;
  • 節點名稱可以叫:ck-task01,並添加描述信息;
  • Worker分組:cdh3
  • 數據源:CLICKHOUSE clickhouse-cdh3
  • sql類型選擇查詢表格;
  • 郵件信息:填寫主題收件人郵箱、抄送人郵箱;
  • sql語句:
SELECT m.id,m.movie_name,m.rating_num,m.rating_people,q.rank,q.quote FROM movie m
LEFT JOIN quote q
ON q.id=m.id
ORDER BY m.rating_num DESC,m.rating_people DESC LIMIT 10;

各個task編寫完畢後,選擇右上角的 選擇線條連接,工作流編寫完畢後如下圖,最後點擊保存,輸入DAG圖名稱,並選擇租戶,選擇添加保存。
工作流DAG圖
回到工作流定義,可以看到新添加的當前用戶的所有工作流列表,點擊右側的操作欄的 上線,然後點擊 運行 執行我們的工作流。當然這裏也可以添加 定時 調度。
工作流列表
點擊運行後,可以在 工作流實例 頁面看到當前運行的Job的狀態信息。每個工作可能會有多個Task構成,查看Task的執行信息可以在 任務實例 頁面查看,操作欄可以查看這個task的執行日誌信息。如果執行成功後,可以選擇工作流的甘特圖,在時間軸上查看執行狀況。
工作流執行狀態的甘特圖
也可以查看工作流的執行的樹形圖信息,如下圖。
工作流執行狀態的屬性圖
運行成功後填寫的收件箱會接收到執行結果的一封郵件,這封郵件中包含了腳本執行的結果。
郵箱中收到的結果的郵件

8 與 Azkaban 的對比

Class Item DolphinScheduler Azkaban
穩定性 單點故障 去中心化的多 Master 和多 Worker 是,單個 Web 和調度程序組合節點
  HA額外要求 不需要(本身就支持HA) DB
  過載處理 任務隊列機制,單個機器上可調度的任務數量可以靈活配置,當任務過多時會緩存在任務隊列裏,不會造成機器卡死 任務太多會卡死服務器
易用性 DAG監控界面 任務狀態、任務類型、重試次數、任務運行機器、可視化變量等關鍵信息一目瞭然 只能看到任務狀態
  可視化流程定義 是,所有流程定義操作都是可視化的,通過拖拽任務來繪製DAG,配置數據源及資源,同時對於第三方系統提供API方式的操作 否,通過自定義DSL繪製DAG打包上傳
  快速部署 一鍵部署 集羣化部署,複雜
功能 是否能暫停和恢復 支持暫停、恢復操作 否,只能先將工作流殺死再重新運行
  是否支持多租戶 支持。DolphinScheduler上的用戶可以通過租戶和Hadoop用戶實現多對一或一對一的映射關係,這對於大數據作業上的調度是非常重要的
  任務類型 支持傳統的shell任務,同時支持大數據平臺任務調度MR、Spark、SQL(MySQL、PostgreSQL、Hive、SparkSQL、Impala、ClickHouse、Oracle)、Python、Procedure、Sub_Process shell、gobblin、hadoopJava、Java、Hive、Pig、Spark、hdfsToTeradata、teradataToHdfs
  契合度 支持大數據作業Spark、Hive、MR的調度,同時由於支持多租戶,於大數據業務更加契合 由於不支持多租戶,在大數據平臺業務使用上不夠靈活
擴展性 是否支持自定義任務類型
  是否支持集羣擴展 是,調度器使用分佈式調度,整體的調度能力會隨着集羣的規模線性增長,Master和Worker支持動態上下線 是,但是複雜,Executor水平擴展

9 小節

Apache DolphinScheduler是一個分佈式、去中心化、易擴展的可視化DAG工作流任務調度系統,從上面的安裝可以看到這個調度系統集成了ZooKeeper,很好的實現了去中心化,每個角色的服務可以起多個,從znode上可以看到mastersworkers的一些元信息都註冊在了上面,交由ZK去選舉,當然它也是一個分佈式的。如果某個服務掛了,ZooKeeper會在剩下的其它節點進行選舉,例如當某些節點的Worker服務掛了,我們不用做任何處理,DolphinScheduler上依然可以正常提交和執行工作,在它的監控中心的頁面可以看到,系統自動選舉出了一個新的Work節點。

# znode上的信息
[zk: localhost:2181(CONNECTED) 1] ls /escheduler
[tasks_queue, dead-servers, masters, lock, workers, tasks_kill]

監控中心

尤其可以多Worker進行分組以及添加數據源的功能,可以指定Wroker節點,直接指定改用戶下的數據,執行SQL腳本,同時頁面增加的監控中心、任務狀態統計、流程狀態統計、流程定義統計等也能很好的幫助我們管理和查看任務執行的信息和集羣的狀態。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章