工作流任務(wù)調(diào)度系統(tǒng):Apache DolphinScheduler

官網(wǎng) | GitHub

目錄
1 概述
1.1 背景
1.2 特點(diǎn)
2 系統(tǒng)架構(gòu)
2.1 名詞解釋
2.2 架構(gòu)
3 部署
3.1 后端部署
3.1.1 基礎(chǔ)軟件安裝
3.1.2 創(chuàng)建部署用戶
3.1.3 下載并解壓
3.1.4 針對(duì)escheduler用戶ssh免密配置
3.1.5 數(shù)據(jù)庫初始化
3.1.6 修改部署目錄權(quán)限及運(yùn)行參數(shù)
3.1.7 執(zhí)行腳本一鍵部署
3.1.8 后端服務(wù)進(jìn)程的說明
3.1.9 dolphinscheduler后端服務(wù)啟停
3.2 前端部署
3.2.1 下載并解壓
3.2.2 執(zhí)行自動(dòng)化部署腳本
3.2.3 dolphinscheduler前端服務(wù)啟停
4 快速開始
5 Worker分組
6 添加數(shù)據(jù)源
7 實(shí)例
8 與 Azkaban 的對(duì)比
9 小節(jié)

1 概述
Apache DolphinScheduler(目前處在孵化階段)是一個(gè)分布式、去中心化、易擴(kuò)展的可視化DAG工作流任務(wù)調(diào)度系統(tǒng),其致力于解決數(shù)據(jù)處理流程中錯(cuò)綜復(fù)雜的依賴關(guān)系,使調(diào)度系統(tǒng)在數(shù)據(jù)處理流程中開箱即用。

DolphinScheduler是今年(2019年)中國易觀公司開源的一個(gè)調(diào)度系統(tǒng),在今年美國時(shí)間2019年8月29號(hào),易觀開源的分布式任務(wù)調(diào)度引擎DolphinScheduler(原EasyScheduler)正式通過頂級(jí)開源組織Apache基金會(huì)的投票決議,根據(jù)Apache基金會(huì)郵件列表顯示,在包含11個(gè)約束性投票(binding votes)和2個(gè)無約束性投票(non-binding votes)的投票全部持贊同意見,無棄權(quán)票和反對(duì)票,投票順利通過,這樣便以全票通過的優(yōu)秀表現(xiàn)正式成為了Apache孵化器項(xiàng)目!

1.1 背景
在2017年,易觀在運(yùn)營自己6.8Pb大小、6.02億月活、每天近萬個(gè)調(diào)度任務(wù)的大數(shù)據(jù)平臺(tái)時(shí),受到ETL復(fù)雜的依賴關(guān)系、平臺(tái)易用性、可維護(hù)性及二次開發(fā)等方面掣肘,易觀的技術(shù)團(tuán)隊(duì)渴望找到一個(gè)具有以下功能的數(shù)據(jù)調(diào)度工具:

易于使用,開發(fā)人員可以通過非常簡單的拖拽操作構(gòu)建ETL過程。不僅對(duì)于ETL開發(fā)人員,無法編寫代碼的人也可以使用此工具進(jìn)行ETL操作,例如系統(tǒng)管理員和分析師;
解決“復(fù)雜任務(wù)依賴”問題,并且可以實(shí)時(shí)監(jiān)視ETL運(yùn)行狀態(tài);
支持多租戶;
支持許多任務(wù)類型:Shell,MR,Spark,SQL(mysql,postgresql,hive,sparksql),Python,Sub_Process,Procedure等;
支持HA和線性可擴(kuò)展性。
易觀技術(shù)團(tuán)隊(duì)意識(shí)到現(xiàn)有開源項(xiàng)目沒有能夠達(dá)到他們要求的,因此決定自行開發(fā)這個(gè)工具。他們?cè)?017年底設(shè)計(jì)了DolphinScheduler的主要架構(gòu);2018年5月完成第一個(gè)內(nèi)部使用版本,后來又迭代了幾個(gè)內(nèi)部版本后,系統(tǒng)逐漸穩(wěn)定下來。

這里介紹一下DolphinScheduler易觀技術(shù)團(tuán)隊(duì),他們是一支來自百度、阿里、百分點(diǎn)、Ptmind、熱云等團(tuán)隊(duì)的“數(shù)據(jù)極客”,秉持易觀“讓數(shù)據(jù)能力平民化”的初心,積極擁抱開源,曾貢獻(xiàn)過Presto Hbase Connector, Presto Kudu Connector等令開發(fā)者稱贊的項(xiàng)目。這次他們?cè)诠镜闹С窒?,積極地將自己開發(fā)的調(diào)度工具推動(dòng)開源,旨在回饋開源的同時(shí),助力打造一個(gè)更為強(qiáng)大的開源生態(tài)。如果躍躍欲試的想去貢獻(xiàn)代碼的,貢獻(xiàn)流程可以參考這篇博客:分布式任務(wù)調(diào)度EasyScheduler貢獻(xiàn)代碼流程。

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

1.2 特點(diǎn)
DolphinScheduler提供了許多易于使用的功能,可加快數(shù)據(jù)ETL工作開發(fā)流程的效率。其主要特點(diǎn)如下:

通過拖拽以DAG 圖的方式將 Task 按照任務(wù)的依賴關(guān)系關(guān)聯(lián)起來,可實(shí)時(shí)可視化監(jiān)控任務(wù)的運(yùn)行狀態(tài);
支持豐富的任務(wù)類型;
支持工作流定時(shí)調(diào)度、依賴調(diào)度、手動(dòng)調(diào)度、手動(dòng)暫停/停止/恢復(fù),同時(shí)支持失敗重試/告警、從指定節(jié)點(diǎn)恢復(fù)失敗、Kill 任務(wù)等操作;
支持工作流全局參數(shù)及節(jié)點(diǎn)自定義參數(shù)設(shè)置;
支持集群HA,通過 Zookeeper實(shí)現(xiàn) Master 集群和 Worker 集群去中心化;
支持工作流運(yùn)行歷史樹形/甘特圖展示、支持任務(wù)狀態(tài)統(tǒng)計(jì)、流程狀態(tài)統(tǒng)計(jì);
支持補(bǔ)數(shù),并行或串行回填數(shù)據(jù)。

2 系統(tǒng)架構(gòu)
2.1 名詞解釋
流程定義:通過拖拽任務(wù)節(jié)點(diǎn)并建立任務(wù)節(jié)點(diǎn)的關(guān)聯(lián)所形成的可視化DAG
流程實(shí)例:流程實(shí)例是流程定義的實(shí)例化,可以通過手動(dòng)啟動(dòng)或定時(shí)調(diào)度生成,流程定義每運(yùn)行一次,產(chǎn)生一個(gè)流程實(shí)例
任務(wù)實(shí)例:任務(wù)實(shí)例是流程定義中任務(wù)節(jié)點(diǎn)的實(shí)例化,標(biāo)識(shí)著具體的任務(wù)執(zhí)行狀態(tài)
任務(wù)類型: 目前支持有SHELL、SQL、SUB_PROCESS(子流程)、PROCEDURE、MR、SPARK、PYTHON、DEPENDENT(依賴),同時(shí)計(jì)劃支持動(dòng)態(tài)插件擴(kuò)展,注意:其中子 SUB_PROCESS 也是一個(gè)單獨(dú)的流程定義,是可以單獨(dú)啟動(dòng)執(zhí)行的
調(diào)度方式: 系統(tǒng)支持基于cron表達(dá)式的定時(shí)調(diào)度和手動(dòng)調(diào)度。命令類型支持:啟動(dòng)工作流、從當(dāng)前節(jié)點(diǎn)開始執(zhí)行、恢復(fù)被容錯(cuò)的工作流、恢復(fù)暫停流程、從失敗節(jié)點(diǎn)開始執(zhí)行、補(bǔ)數(shù)、定時(shí)、重跑、暫停、停止、恢復(fù)等待線程。其中 恢復(fù)被容錯(cuò)的工作流 和 恢復(fù)等待線程 兩種命令類型是由調(diào)度內(nèi)部控制使用,外部無法調(diào)用
定時(shí)調(diào)度:系統(tǒng)采用 quartz 分布式調(diào)度器,并同時(shí)支持cron表達(dá)式可視化的生成
依賴:系統(tǒng)不單單支持 DAG 簡單的前驅(qū)和后繼節(jié)點(diǎn)之間的依賴,同時(shí)還提供任務(wù)依賴節(jié)點(diǎn),支持流程間的自定義任務(wù)依賴
優(yōu)先級(jí) :支持流程實(shí)例和任務(wù)實(shí)例的優(yōu)先級(jí),如果流程實(shí)例和任務(wù)實(shí)例的優(yōu)先級(jí)不設(shè)置,則默認(rèn)是先進(jìn)先出
郵件告警:支持 SQL任務(wù) 查詢結(jié)果郵件發(fā)送,流程實(shí)例運(yùn)行結(jié)果郵件告警及容錯(cuò)告警通知
失敗策略:對(duì)于并行運(yùn)行的任務(wù),如果有任務(wù)失敗,提供兩種失敗策略處理方式,繼續(xù)是指不管并行運(yùn)行任務(wù)的狀態(tài),直到流程失敗結(jié)束。結(jié)束是指一旦發(fā)現(xiàn)失敗任務(wù),則同時(shí)Kill掉正在運(yùn)行的并行任務(wù),流程失敗結(jié)束
補(bǔ)數(shù):補(bǔ)歷史數(shù)據(jù),支持區(qū)間并行和串行兩種補(bǔ)數(shù)方式
2.2 架構(gòu)

關(guān)于更詳細(xì)的系統(tǒng)架構(gòu)設(shè)計(jì)可以查看官方提供的劉小春(xiaochun.liu)一篇博客 DolphinScheduler系統(tǒng)架構(gòu)設(shè)計(jì)。

3 部署
3.1 后端部署
后端有2種部署方式,分別為自動(dòng)化部署和編譯源碼部署。下面主要介紹下載編譯后的二進(jìn)制包一鍵自動(dòng)化部署的方式完成DolphinScheduler后端部署。

3.1.1 基礎(chǔ)軟件安裝
Mysql (5.5+) : 必裝
JDK (1.8+) : 必裝
ZooKeeper(3.4.6+) :必裝
Hadoop(2.6+) :選裝, 如果需要使用到資源上傳功能,MapReduce任務(wù)提交則需要配置Hadoop(上傳的資源文件目前保存在Hdfs上)
Hive(1.2.1) : 選裝,hive任務(wù)提交需要安裝
Spark(1.x,2.x) : 選裝,Spark任務(wù)提交需要安裝
PostgreSQL(8.2.15+) : 選裝,PostgreSQL PostgreSQL存儲(chǔ)過程需要安裝
編譯時(shí)
如果是編譯源碼

Node.js:畢裝
Maven:畢裝,最好 3.6 版本
注意:EasyScheduler本身不依賴Hadoop、Hive、Spark、PostgreSQL,僅是會(huì)調(diào)用他們的Client,用于對(duì)應(yīng)任務(wù)的運(yùn)行。

3.1.2 創(chuàng)建部署用戶
在所有需要部署調(diào)度的機(jī)器上創(chuàng)建部署用戶(本次以node2、node3節(jié)點(diǎn)為例),因?yàn)閣orker服務(wù)是以 sudo -u {linux-user} 方式來執(zhí)行作業(yè),所以部署用戶需要有 sudo 權(quán)限,而且是免密的。

1 創(chuàng)建用戶

useradd escheduler

2 設(shè)置 escheduler 用戶密碼

passwd escheduler

3 賦予sudo權(quán)限。編輯系統(tǒng) sudoers 文件

如果沒有編輯權(quán)限,以root用戶登錄,賦予w權(quán)限

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 創(chuàng)建安裝目錄

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 # 基礎(chǔ)服務(wù)啟動(dòng)腳本
├── conf # 項(xiàng)目配置文件
├── install.sh # 一鍵部署腳本
├── lib # 項(xiàng)目依賴jar包,包括各個(gè)模塊jar和第三方j(luò)ar
├── script # 集群啟動(dòng)、停止和服務(wù)監(jiān)控啟停腳本
└── sql # 項(xiàng)目依賴sql文件
5 directories, 1 file

3.1.4 針對(duì)escheduler用戶ssh免密配置

1 配置SSH免密

1.1 node2 節(jié)點(diǎn)執(zhí)行

有提示直接回車

ssh-keygen -t rsa

拷貝到node2和node3。提示輸入密碼時(shí),輸入 escheduler 用戶的密碼

ssh-copy-id -i ~/.ssh/id_rsa.pub escheduler@node2
ssh-copy-id -i ~/.ssh/id_rsa.pub escheduler@node3

1.2 node3 節(jié)點(diǎn)執(zhí)行

有提示直接回車

ssh-keygen -t rsa

拷貝到node2和node3。提示輸入密碼時(shí),輸入 escheduler 用戶的密碼

ssh-copy-id -i ~/.ssh/id_rsa.pub escheduler@node2
ssh-copy-id -i ~/.ssh/id_rsa.pub escheduler@node3

3.1.5 數(shù)據(jù)庫初始化
執(zhí)行以下命令創(chuàng)建數(shù)據(jù)庫和賬號(hào)

CREATE DATABASE escheduler DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
-- 設(shè)置數(shù)據(jù)用戶escheduler的訪問密碼為 escheduler,并且不對(duì)訪問的ip做限制
-- 測(cè)試環(huán)境將訪問設(shè)置為所有,如果是生產(chǎn),可以限制只能子網(wǎng)段的ip才能訪問('198.168.33.%')
GRANT ALL PRIVILEGES ON escheduler.* TO 'escheduler'@'%' IDENTIFIED BY 'escheduler';
flush privileges;

創(chuàng)建表和導(dǎo)入基礎(chǔ)數(shù)據(jù) 修改vim /opt/DolphinScheduler/escheduler/conf/dao/data_source.properties中的下列屬性

大概在第 4 行修改MySQL數(shù)據(jù)庫的url

spring.datasource.url=jdbc:mysql://node1:3306/escheduler?characterEncoding=UTF-8

用戶名。

spring.datasource.username=escheduler

密碼。填入上一步IDENTIFIED BY 后面設(shè)置的密碼

spring.datasource.password=escheduler

執(zhí)行創(chuàng)建表和導(dǎo)入基礎(chǔ)數(shù)據(jù)腳本

前面已進(jìn)入/opt/DolphinScheduler/escheduler-backend目錄下,然后執(zhí)行數(shù)據(jù)初始化腳本

最后看到 create escheduler success 表示數(shù)據(jù)庫初始化成功

sh ./script/create_escheduler.sh

3.1.6 修改部署目錄權(quán)限及運(yùn)行參數(shù)

1 修改conf/env/目錄下的 .escheduler_env.sh 環(huán)境變量

vim conf/env/.escheduler_env.sh

將對(duì)應(yīng)的修改為自己的組件或框架的路徑

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中的各參數(shù),替換成自身業(yè)務(wù)所需的值,這里只列出了重要的修改項(xiàng),其它默認(rèn)不用改即可。

mysql配置

mysql 地址,端口

mysqlHost="192.168.33.3:3306"

mysql 數(shù)據(jù)庫名稱

mysqlDb="escheduler"

mysql 用戶名

mysqlUserName="escheduler"

mysql 密碼

注意:如果有特殊字符,請(qǐng)用 \ 轉(zhuǎn)移符進(jìn)行轉(zhuǎn)移

mysqlPassword="escheduler"

conf/config/install_config.conf配置

注意:安裝路徑,不要當(dāng)前路徑(pwd)一樣。一鍵部署腳本分發(fā)到其它節(jié)點(diǎn)時(shí)的安裝路徑

installPath="/opt/DolphinScheduler/escheduler-backend"

部署用戶

注意:部署用戶需要有sudo權(quán)限及操作hdfs的權(quán)限,如果開啟hdfs,根目錄需要自行創(chuàng)建

deployUser="escheduler"

zk集群

zkQuorum="192.168.33.3:2181,192.168.33.6:2181,192.168.33.9:2181"

安裝hosts

注意:安裝調(diào)度的機(jī)器hostname列表,如果是偽分布式,則只需寫一個(gè)偽分布式hostname即可

ips="192.168.33.6,192.168.33.9"

conf/config/run_config.conf配置

運(yùn)行Master的機(jī)器

注意:部署master的機(jī)器hostname列表

masters="192.168.33.6"

運(yùn)行Worker的機(jī)器

注意:部署worker的機(jī)器hostname列表

workers="192.168.33.6,192.168.33.9"

運(yùn)行Alert的機(jī)器

注意:部署alert server的機(jī)器hostname列表

alertServer="192.168.33.6"

運(yùn)行Api的機(jī)器

注意:部署api server的機(jī)器hostname列表

apiServers="192.168.33.6"

用到郵箱發(fā)送郵件時(shí)務(wù)必配置上郵件服務(wù),否則執(zhí)行結(jié)果發(fā)送時(shí)會(huì)提示失敗

cn.escheduler.server.worker.runner.TaskScheduleThread:[249] - task escheduler # failure : send mail failed!

java.lang.RuntimeException: send mail failed!

alert配置

郵件協(xié)議,默認(rèn)是SMTP郵件協(xié)議

mailProtocol="SMTP"

郵件服務(wù)host。以網(wǎng)易郵箱為例。QQ郵箱的服務(wù)為 smtp.qq.com

mailServerHost="smtp.163.com"

郵件服務(wù)端口。SSL協(xié)議端口 465/994,非SSL協(xié)議端口 25

mailServerPort="465"

發(fā)送人。

網(wǎng)易郵箱在 客戶端授權(quán)密碼 獲取,具體可以看下圖

mailSender="*******yore@163.com"

發(fā)送人密碼

mailPassword="yore***"

下載Excel路徑

xlsFilePath="/home/escheduler/xls"

是否啟動(dòng)監(jiān)控自啟動(dòng)腳本

開關(guān)變量,在1.0.3版本中增加,控制是否啟動(dòng)自啟動(dòng)腳本(監(jiān)控master,worker狀態(tài),如果掉線會(huì)自動(dòng)啟動(dòng))

默認(rèn)值為"false"表示不啟動(dòng)自啟動(dòng)腳本,如果需要啟動(dòng)改為"true"

monitorServerState="true"

資源中心上傳選擇存儲(chǔ)方式:HDFS,S3,NONE

resUploadStartupType="HDFS"

如果resUploadStartupType為HDFS,defaultFS寫namenode地址,支持HA,需要將core-site.xml和hdfs-site.xml放到conf目錄下

如果是S3,則寫S3地址,比如說:s3a://escheduler,注意,一定要?jiǎng)?chuàng)建根目錄/escheduler

defaultFS="hdfs://192.168.33.3:8020"

resourcemanager HA配置,如果是單resourcemanager,這里為yarnHaIps=""

yarnHaIps="192.168.33.3"

如果是單 resourcemanager,只需要配置一個(gè)主機(jī)名稱,如果是resourcemanager HA,則默認(rèn)配置就好

singleYarnIp="192.168.33.3"

common 配置

程序路徑

programPath="/opt/DolphinScheduler/escheduler-backend"

下載路徑

downloadPath="/tmp/escheduler/download"

任務(wù)執(zhí)行路徑

execPath="/tmp/escheduler/exec"

SHELL環(huán)境變量路徑

shellEnvPath="$installPath/conf/env/.escheduler_env.sh"

資源文件的后綴

resSuffixs="txt,log,sh,conf,cfg,py,java,sql,hql,xml"

api 配置

api 服務(wù)端口

apiServerPort="12345"

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

cp HADOOP_HOME/etc/hadoop/hdfs-site.xml conf/ cpHADOOP_HOME/etc/hadoop/core-site.xml conf/
1
2
網(wǎng)易云郵箱服務(wù)客戶端用戶名和密碼獲取,開啟客戶端授權(quán)碼,并獲取。

如果 DolphinScheduler 已經(jīng)安裝,則可以通過設(shè)置部署的后端服務(wù)下的conf/alert.properties文件

alert type is EMAIL/SMS

alert.type=EMAIL

mail server configuration

mail.protocol=SMTP

以網(wǎng)易郵箱為例

mail.server.host=smtp.163.com

SSL協(xié)議端口 465/994,非SSL協(xié)議端口 25

mail.server.port=465
mail.sender=*******yore@163.com
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 執(zhí)行腳本一鍵部署

1 一鍵部署并啟動(dòng)

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進(jìn)程

3.1 node2

jps -l | grep escheduler

[escheduler@node2 escheduler-backend]$ jps
31651 WorkerServer # worker服務(wù)
31784 ApiApplicationServer # api服務(wù)
31609 MasterServer # master服務(wù)
31743 AlertServer # alert服務(wù)
31695 LoggerServer # logger服務(wù)

3.2 node3

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

錯(cuò)誤1:如果查看/opt/DolphinScheduler/escheduler-backend/logs/escheduler-api-server-*.out日志報(bào)如下錯(cuò)誤

nohup: failed to run command ‘/bin/java’: No such file or directory
1
解決:將JAVA_HOME/bin下的java軟連接到/bin下。(每個(gè)dolphinscheduler節(jié)點(diǎn)都執(zhí)行)

ln -s $JAVA_HOME/bin/java /bin/java
1
3.1.8 服務(wù)進(jìn)程的說明
由前面我們可以看到,后端服務(wù)正常啟動(dòng)后,共有 5 個(gè)進(jìn)程:WorkerServer、ApiApplicationServer、MasterServer、AlertServer、LoggerServer 。另外還有一個(gè) UI,具體說明如下:

服務(wù) 說明
MasterServer 主要負(fù)責(zé) DAG 的切分和任務(wù)狀態(tài)的監(jiān)控
WorkerServer/
LoggerServer 主要負(fù)責(zé)任務(wù)的提交、執(zhí)行和任務(wù)狀態(tài)的更新。LoggerServer用于Rest Api通過 RPC 查看日志
ApiServer 提供Rest Api服務(wù),供UI進(jìn)行調(diào)用
AlertServer 提供告警服務(wù)
UI 前端頁面展示
3.1.9 dolphinscheduler后端服務(wù)啟停

啟動(dòng)

/opt/DolphinScheduler/escheduler-backend/script/start_all.sh

停止

/opt/DolphinScheduler/escheduler-backend/script/stop_all.sh

3.2 前端部署
前端有3種部署方式,分別為自動(dòng)化部署,手動(dòng)部署和編譯源碼部署。這里主要使用自動(dòng)化腳本方式部署DolphinScheduler前端服務(wù)。

3.2.1 下載并解壓

1 下載 UI 前端。簡稱escheduler-ui

在node2節(jié)點(diǎn)下的 /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 執(zhí)行自動(dòng)化部署腳本
執(zhí)行自動(dòng)化部署腳本。腳本會(huì)提示一些參數(shù),根據(jù)提示完成安裝。

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

……

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

使用自動(dòng)化部署腳本會(huì)檢查系統(tǒng)環(huán)境是否安裝了Nginx,如果沒有安裝則會(huì)通過網(wǎng)絡(luò)自動(dòng)下載Nginx包安裝,通過引導(dǎo)設(shè)置后的Nginx配置文件為/etc/nginx/conf.d/escheduler.conf。但生產(chǎn)環(huán)境一般法法訪問外網(wǎng),此時(shí)可以通過手動(dòng)離線安裝Nginx,然后進(jìn)行一些配置即可。

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

下面在手動(dòng)再Nginx中添加一個(gè)DolphinSchedule 服務(wù)配置。因?yàn)樵?/etc/nginx/nginx.conf(Nginx默認(rèn)加載的配置文件)中有include /etc/nginx/conf.d/.conf ;,所以我們可以在 /etc/nginx/conf.d/ 下創(chuàng)建一個(gè) conf后綴的配置文件,配置文件的文件名隨意,例如叫 escheduler.conf。這里需要特別注意的是在 /etc/nginx/nginx.conf 配置文件中前面有一個(gè)配置 user nginx 如果啟動(dòng)Nginx的用戶不是 nginx,一定要修改為啟動(dòng)Nginx的用戶,否則代理的服務(wù)會(huì)報(bào) 403 的錯(cuò)誤。這里我們?cè)?etc/nginx/conf.d/escheduler.conf配置如下內(nèi)容,重點(diǎn)在 server 中配置 listen(DolphinSchedule Web UI 的端口)、*root **(解壓的escheduler-ui 中的 dist 路徑 )、proxy_pass (DolphinSchedule后臺(tái)接口的地址)等信息。最后重啟Nginx執(zhí)行命令 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-IPremote_addr;
proxy_set_header x_real_ipP remote_addr; proxy_set_header remote_addrremote_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 Upgradehttp_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
1
2
3.2.3 dolphinscheduler前端服務(wù)啟停

1 啟動(dòng)

systemctl start nginx

2 狀態(tài)

systemctl status nginx

3 停止

nginx -s stop

systemctl stop nginx

4 快速開始
瀏覽器訪問http://192.168.33.6:8888,如下圖所示。

在上述登陸頁面默認(rèn)的賬戶的用戶名為 admin 密碼為escheduler123,這個(gè)賬戶也是系統(tǒng)默認(rèn)的管理員賬戶,登陸成功后可以修改密碼。成功登陸有主頁面如下所示

創(chuàng)建一個(gè)隊(duì)列。隊(duì)列管理 -> 創(chuàng)建隊(duì)列 -> 輸入名稱和隊(duì)列值 -> 提交。

創(chuàng)建租戶。租戶管理 -> 創(chuàng)建租戶 -> 輸入租戶編碼、租戶名稱和隊(duì)列值 -> 提交。

創(chuàng)建普通用戶。用戶管理 -> 創(chuàng)建用戶 -> 輸入用戶名稱、密碼、租戶名和郵箱,手機(jī)號(hào)選填 -> 提交。

創(chuàng)建警告組。警告組管理 -> 創(chuàng)建警告組 -> 輸入組名稱、組類型(郵件、短信)-> 提交。

使用普通用戶登錄(用戶名和密碼都是demo)。點(diǎn)擊右上角用戶名“退出”,重新使用普通用戶登錄。登陸成功的首頁如下。

創(chuàng)建一個(gè)項(xiàng)目。點(diǎn)擊頁面頭部的項(xiàng)目管理,進(jìn)入項(xiàng)目頁面,再點(diǎn)擊創(chuàng)建項(xiàng)目,創(chuàng)建一個(gè)DolphinScheduler任務(wù)調(diào)度項(xiàng)目,在彈出的框中輸入項(xiàng)目名稱和描述,例如這里創(chuàng)建一個(gè)hello_dolphinScheduler名稱的項(xiàng)目,最后點(diǎn)擊提交。

項(xiàng)目創(chuàng)建完畢后,在項(xiàng)目管理頁面點(diǎn)擊我們創(chuàng)建的項(xiàng)目,進(jìn)入該項(xiàng)目的管理頁面。點(diǎn)擊工作流定義 -> 創(chuàng)建工作流 -> 在左側(cè)工具欄可以選擇(SHELL、USB_PROCESS、PROCEDURE、SQL、SPARK、MapReduce、PYTHON、DEPENDENT)。拖拽SHELL節(jié)點(diǎn)到畫布,新增一個(gè)Shell任務(wù),填寫 節(jié)點(diǎn)名稱、描述、腳本 字段;選擇 任務(wù)優(yōu)先級(jí) ,級(jí)別高的任務(wù)在執(zhí)行隊(duì)列中會(huì)優(yōu)先執(zhí)行,相同優(yōu)先級(jí)的任務(wù)按照先進(jìn)先出的順序執(zhí)行;超時(shí)告警, 填寫 超時(shí)時(shí)長 ,當(dāng)任務(wù)執(zhí)行時(shí)間超過超時(shí)時(shí)長可以告警并且超時(shí)失敗。(注意:這里的節(jié)點(diǎn)不是機(jī)器的節(jié)點(diǎn),而應(yīng)該是工作流的節(jié)點(diǎn))

確認(rèn)修改完畢后,點(diǎn)擊保存,此時(shí)設(shè)置DAG圖名稱,選擇組租戶,最后添加。

未上線狀態(tài)的工作流定義可以編輯,但是不可以運(yùn)行,所以要執(zhí)行工作流,需要先上線工作流

點(diǎn)擊”運(yùn)行“,執(zhí)行工作流。運(yùn)行參數(shù)說明:

失敗策略:當(dāng)某一個(gè)任務(wù)節(jié)點(diǎn)執(zhí)行失敗時(shí),其他并行的任務(wù)節(jié)點(diǎn)需要執(zhí)行的策略?!崩^續(xù)“表示:其他任務(wù)節(jié)點(diǎn)正常執(zhí)行,”結(jié)束“表示:終止所有正在執(zhí)行的任務(wù),并終止整個(gè)流程。
通知策略:當(dāng)流程結(jié)束,根據(jù)流程狀態(tài)發(fā)送流程執(zhí)行信息通知郵件。
流程優(yōu)先級(jí):流程運(yùn)行的優(yōu)先級(jí),分五個(gè)等級(jí):最高(HIGHEST),高(HIGH),中(MEDIUM),低(LOW),最低(LOWEST)。級(jí)別高的流程在執(zhí)行隊(duì)列中會(huì)優(yōu)先執(zhí)行,相同優(yōu)先級(jí)的流程按照先進(jìn)先出的順序執(zhí)行。
worker分組: 這個(gè)流程只能在指定的機(jī)器組里執(zhí)行。默認(rèn)是Default,可以在任一worker上執(zhí)行。
通知組: 當(dāng)流程結(jié)束,或者發(fā)生容錯(cuò)時(shí),會(huì)發(fā)送流程信息郵件到通知組里所有成員。
收件人:輸入郵箱后按回車鍵保存。當(dāng)流程結(jié)束、發(fā)生容錯(cuò)時(shí),會(huì)發(fā)送告警郵件到收件人列表。
抄送人:輸入郵箱后按回車鍵保存。當(dāng)流程結(jié)束、發(fā)生容錯(cuò)時(shí),會(huì)抄送告警郵件到抄送人列表。

點(diǎn)擊任務(wù)實(shí)例可以查看每個(gè)任務(wù)的列表信息,點(diǎn)擊操作欄,可以看到任務(wù)執(zhí)行的日志信息。

5 Worker分組和數(shù)據(jù)源添加
worker分組,提供了一種讓任務(wù)在指定的worker上運(yùn)行的機(jī)制。管理員創(chuàng)建worker分組,在任務(wù)節(jié)點(diǎn)和運(yùn)行參數(shù)中設(shè)置中可以指定該任務(wù)運(yùn)行的worker分組,如果指定的分組被刪除或者沒有指定分組,則該任務(wù)會(huì)在任一worker上運(yùn)行。worker分組內(nèi)多個(gè)ip地址(不能寫別名),以英文逗號(hào)分隔。

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

創(chuàng)建Worker分組。填寫組名稱和IP,IP可以是多個(gè),用英文逗號(hào)分割即可。

例如下圖,我們將Worker的IP分為了兩組。

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

下面我們以Impala為例,選擇頁面頭部的 數(shù)據(jù)源中心 -> 添加數(shù)據(jù)源,會(huì)彈出下圖 編輯數(shù)據(jù)源 彈窗,主要填寫如下幾項(xiàng)。因?yàn)镮mpala沒有設(shè)置密碼,用戶為必填可以任意添加一個(gè),在jdbc連接參數(shù)中必須添加 {"auth":"noSasl"}參數(shù),否則會(huì)一直等待確認(rèn)認(rèn)證。

其它數(shù)據(jù)源類似,例如我們添加如下幾個(gè)數(shù)據(jù)源,后面會(huì)用到ClickHouse(詳見我的另一篇博客 ClickHouse的安裝(含集群方式)和使用)。

7 實(shí)例
在項(xiàng)目管理下,點(diǎn)擊工作流定義,在工具欄處選擇最后一行的DEPENDENT定義一個(gè)帶依賴的工作流Job,拖動(dòng)到編輯面板,設(shè)置task的節(jié)點(diǎn)名為cdh2-task1,在 Worker分組 中選擇執(zhí)行的Worker節(jié)點(diǎn)為cdh2,編輯完這個(gè)Task后選擇 確認(rèn)添加。選擇執(zhí)行的Worker分組名,這里選擇前面設(shè)置的cdh2組,確認(rèn)添加,如下圖所示。同樣的方式設(shè)置第二個(gè)依賴Task,將其Worker分組設(shè)置到cdh3節(jié)點(diǎn),并添加依賴為 且。

接下來設(shè)置兩個(gè)Shell執(zhí)行腳本,cdh2-task11上執(zhí)行task11,主要是在cdh2上執(zhí)行一個(gè)hostname命令,打印執(zhí)行節(jié)點(diǎn)的HostName。同樣的方式,在依賴節(jié)點(diǎn)cdh3-task21上設(shè)置在cdh3執(zhí)行,也是執(zhí)行hostname命令。最后再在依賴節(jié)點(diǎn)cdh3-task21上添加一個(gè)SQL腳本,查詢我們的豆瓣電影數(shù)據(jù),具體操作如下

在工具欄拖拽添加一個(gè)SQL腳本Task節(jié)點(diǎn);
節(jié)點(diǎn)名稱可以叫:ck-task01,并添加描述信息;
Worker分組:cdh3;
數(shù)據(jù)源: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;

各個(gè)task編寫完畢后,選擇右上角的 選擇線條連接,工作流編寫完畢后如下圖,最后點(diǎn)擊保存,輸入DAG圖名稱,并選擇租戶,選擇添加保存。

回到工作流定義,可以看到新添加的當(dāng)前用戶的所有工作流列表,點(diǎn)擊右側(cè)的操作欄的 上線,然后點(diǎn)擊 運(yùn)行 執(zhí)行我們的工作流。當(dāng)然這里也可以添加 定時(shí) 調(diào)度。

點(diǎn)擊運(yùn)行后,可以在 工作流實(shí)例 頁面看到當(dāng)前運(yùn)行的Job的狀態(tài)信息。每個(gè)工作可能會(huì)有多個(gè)Task構(gòu)成,查看Task的執(zhí)行信息可以在 任務(wù)實(shí)例 頁面查看,操作欄可以查看這個(gè)task的執(zhí)行日志信息。如果執(zhí)行成功后,可以選擇工作流的甘特圖,在時(shí)間軸上查看執(zhí)行狀況。

也可以查看工作流的執(zhí)行的樹形圖信息,如下圖。

運(yùn)行成功后填寫的收件箱會(huì)接收到執(zhí)行結(jié)果的一封郵件,這封郵件中包含了腳本執(zhí)行的結(jié)果。

8 與 Azkaban 的對(duì)比
Class Item DolphinScheduler Azkaban
穩(wěn)定性 單點(diǎn)故障 去中心化的多 Master 和多 Worker 是,單個(gè) Web 和調(diào)度程序組合節(jié)點(diǎn)
HA額外要求 不需要(本身就支持HA) DB
過載處理 任務(wù)隊(duì)列機(jī)制,單個(gè)機(jī)器上可調(diào)度的任務(wù)數(shù)量可以靈活配置,當(dāng)任務(wù)過多時(shí)會(huì)緩存在任務(wù)隊(duì)列里,不會(huì)造成機(jī)器卡死 任務(wù)太多會(huì)卡死服務(wù)器
易用性 DAG監(jiān)控界面 任務(wù)狀態(tài)、任務(wù)類型、重試次數(shù)、任務(wù)運(yùn)行機(jī)器、可視化變量等關(guān)鍵信息一目了然 只能看到任務(wù)狀態(tài)
可視化流程定義 是,所有流程定義操作都是可視化的,通過拖拽任務(wù)來繪制DAG,配置數(shù)據(jù)源及資源,同時(shí)對(duì)于第三方系統(tǒng)提供API方式的操作 否,通過自定義DSL繪制DAG打包上傳
快速部署 一鍵部署 集群化部署,復(fù)雜
功能 是否能暫停和恢復(fù) 支持暫停、恢復(fù)操作 否,只能先將工作流殺死再重新運(yùn)行
是否支持多租戶 支持。DolphinScheduler上的用戶可以通過租戶和Hadoop用戶實(shí)現(xiàn)多對(duì)一或一對(duì)一的映射關(guān)系,這對(duì)于大數(shù)據(jù)作業(yè)上的調(diào)度是非常重要的 否
任務(wù)類型 支持傳統(tǒng)的shell任務(wù),同時(shí)支持大數(shù)據(jù)平臺(tái)任務(wù)調(diào)度MR、Spark、SQL(MySQL、PostgreSQL、Hive、SparkSQL、Impala、ClickHouse、Oracle)、Python、Procedure、Sub_Process shell、gobblin、hadoopJava、Java、Hive、Pig、Spark、hdfsToTeradata、teradataToHdfs
契合度 支持大數(shù)據(jù)作業(yè)Spark、Hive、MR的調(diào)度,同時(shí)由于支持多租戶,于大數(shù)據(jù)業(yè)務(wù)更加契合 由于不支持多租戶,在大數(shù)據(jù)平臺(tái)業(yè)務(wù)使用上不夠靈活
擴(kuò)展性 是否支持自定義任務(wù)類型 是 是
是否支持集群擴(kuò)展 是,調(diào)度器使用分布式調(diào)度,整體的調(diào)度能力會(huì)隨著集群的規(guī)模線性增長,Master和Worker支持動(dòng)態(tài)上下線 是,但是復(fù)雜,Executor水平擴(kuò)展
9 小節(jié)
Apache DolphinScheduler是一個(gè)分布式、去中心化、易擴(kuò)展的可視化DAG工作流任務(wù)調(diào)度系統(tǒng),從上面的安裝可以看到這個(gè)調(diào)度系統(tǒng)集成了ZooKeeper,很好的實(shí)現(xiàn)了去中心化,每個(gè)角色的服務(wù)可以起多個(gè),從znode上可以看到masters和workers的一些元信息都注冊(cè)在了上面,交由ZK去選舉,當(dāng)然它也是一個(gè)分布式的。如果某個(gè)服務(wù)掛了,ZooKeeper會(huì)在剩下的其它節(jié)點(diǎn)進(jìn)行選舉,例如當(dāng)某些節(jié)點(diǎn)的Worker服務(wù)掛了,我們不用做任何處理,DolphinScheduler上依然可以正常提交和執(zhí)行工作,在它的監(jiān)控中心的頁面可以看到,系統(tǒng)自動(dòng)選舉出了一個(gè)新的Work節(jié)點(diǎn)。

znode上的信息

[zk: localhost:2181(CONNECTED) 1] ls /escheduler
[tasks_queue, dead-servers, masters, lock, workers, tasks_kill]

尤其可以多Worker進(jìn)行分組以及添加數(shù)據(jù)源的功能,可以指定Wroker節(jié)點(diǎn),直接指定改用戶下的數(shù)據(jù),執(zhí)行SQL腳本,同時(shí)頁面增加的監(jiān)控中心、任務(wù)狀態(tài)統(tǒng)計(jì)、流程狀態(tài)統(tǒng)計(jì)、流程定義統(tǒng)計(jì)等也能很好的幫助我們管理和查看任務(wù)執(zhí)行的信息和集群的狀態(tài)。

————————————————
原文鏈接:https://blog.csdn.net/github_39577257/article/details/102783298

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容