Apache DolphinScheduler
一、说明
1.1 DolphinScheduler 说明
Apache DolphinScheduler 是一个分布式去中心化,易扩展的可视化 DAG 工作流任务调度
系统。
致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用。
1.2 相关网址
官网:
https://dolphinscheduler.apache.org/zh-cn/
Git 地址:
https://github.com/apache/incubator-dolphinscheduler
1.3 名词解释
DAG: 全称 Directed Acyclic Graph,简称 DAG。工作流中的 Task 任务以有向无环图的
形式组装起来,从入度为零的节点进行拓扑遍历,直到无后继节点为止。
流程定义:通过拖拽 任务节点 并建立 任务节点的关联 所形成的 可视化 DAG
流程实例:流程定义的实例化,可以通过手动启动或定时调度生成,流程定义每运行一次,
产生一个流程实例
任务实例:流程定义 中 任务节点的实例化,标识着具体的 任务执行状态
任务类型:目前支持有 SHELL、SQL、SUB_PROCESS(子流程)、PROCEDURE、MR、SPARK、
PYTHON、DEPENDENT(依赖),同时计划支持动态插件扩展,注意:其中子 SUB_PROCESS 也
是一个单独的流程定义,是可以单独启动执行的
调度方式:系统支持基于 cron 表达式的定时调度和手动调度。命令类型支持:启动工作流、
从当前节点开始执行、恢复被容错的工作流、恢复暂停流程、从失败节点开始执行、补数、
定时、重跑、暂停、停止、恢复等待线程。其中 恢复被容错的工作流 和 恢复等待线程 两
种命令类型是由调度内部控制使用,外部无法调用
定时调度:系统采用 quartz 分布式调度器,并同时支持 cron 表达式可视化的生成
依赖:系统不单单支持 DAG 简单的前驱和后继节点之间的依赖,同时还提供任务依赖节点,
支持流程间的自定义任务依赖
优先级 :支持流程实例和任务实例的优先级,如果流程实例和任务实例的优先级不设置,
则默认是先进先出
邮件告警:支持 SQL 任务 查询结果邮件发送,流程实例运行结果邮件告警及容错告警通知
失败策略:对于并行运行的任务,如果有任务失败,提供两种失败策略处理方式,继续 是
指不管并行运行任务的状态,直到流程失败结束。结束 是指一旦发现失败任务,则同时 Kill
掉正在运行的并行任务,流程失败结束
补数:补历史数据,支持 区间并行和串行 两种补数方式
1.4 DolphinScheduler 架构
1.4.1 MasterServer
MasterServer 采用分布式无中心设计理念,MasterServer 主要负责 DAG 任务切分、任务
提交监控,并同时监听其它 MasterServer 和 WorkerServer 的健康状态。 MasterServer 服
务启动时向 Zookeeper 注册临时节点,通过 监听 Zookeeper 临时节点 变化来进行容错
处理。
该服务内主要包含:
Distributed Quartz 分布式调度组件,主要负责 定时任务的启停 操作,当 quartz 调起任
务后,Master 内部会有线程池具体负责处理任务的后续操作
MasterSchedulerThread 是一个扫描线程,定时扫描数据库中的 command 表,根据不同的
命令类型进行不同的业务操作
MasterExecThread 主要是负责 DAG 任务切分、任务提交监控、各种不同命令类型的逻辑
处理
MasterTaskExecThread 主要负责任务的持久化
1.4.2 WorkerServer
WorkerServer 也采用分布式无中心设计理念,WorkerServer 主要负责 任务的执行和提供
日志服务。WorkerServer 服务启动时向 Zookeeper 注册临时节点,并维持心跳。
该服务包含:
FetchTaskThread 主要负责不断 从 Task Queue 中领取任务,并根据不同任务类型调用
TaskScheduleThread 对应执行器。
LoggerServer 是一个 RPC 服务,提供日志分片查看、刷新和下载等功能
1.4.3 ZooKeeper
ZooKeeper 服务,系统中的 MasterServer 和 WorkerServer 节点都通过 ZooKeeper 来进
行 集群管理和容错。另外系统还基于 ZooKeeper 进行 事件监听和分布式锁。 我们也曾
经基于 Redis 实现过队列,不过我们希望 DolphinScheduler 依赖到的组件尽量地少,所以
最后还是去掉了 Redis 实现。
1.4.4 Task Queue
提供 任务队列 的操作,目前队列也是基于 Zookeeper 来实现。由于队列中存的信息较少,
不必担心队列里数据过多的情况,实际上我们压测过百万级数据存队列,对系统稳定性和性
能没影响。
1.4.5 Alert
提供 告警相关 接口,接口主要包括告警两种类型的告警数据的存储、查询和通知功能。其
中通知功能又有邮件通知和**SNMP(暂未实现)**两种。
1.4.6 API
API 接口层,主要负责 处理前端 UI 层的请求。该服务统一提供 RESTful api 向外部提供请
求服务。 接口包括工作流的创建、定义、查询、修改、发布、下线、手工启动、停止、暂
停、恢复、从该节点开始执行等等。
1.4.7 UI
系统的前端页面,提供系统的各种可视化操作界面。
二、集群规划
2.1 集群配置
2.2 软件版本
版本
Cloudera 5.14.2
软件
CDH
dolphinscheduler 1.2.0
2.3 集群规划
注:
以下所有节点均已部署 CDH 版本大数据相关组件。
若为 Apache 版本,则需要将大数据组件的环境变量设为全局,或者在各个租户下添加环
境变量和线上环境的配置参数,防止出现 sudo -u $tenant 无法调用大数据组件的情况。
hostname MasterServer WorkerServer/LoggerServer
Cluster01
Cluster02
Cluster03
AlertServer ApiServer
√
√
√
√
√
UI
√
√
√
√
三、环境准备
3.1 基础软件准备(必装项请自行安装)
Mysql (5.7 +)
JDK (1.8+)
CDH(5.14.2)
注意:DolphinScheduler 本身不依赖 Hadoop、Hive、Spark,仅是会调用他们的 Client,用
于对应任务的运行。
3.2 pip、kazoo 安装
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
sudo python get-pip.py
pip --version
pip install kazoo
3.3 创建部署用户
# 创建部署用户
userdel -r dolphinscheduler
useradd dolphinscheduler&& echo dolphinscheduler | passwd --stdin dolphinscheduler
# 赋予 sudo 权限
chmod 640 /etc/sudoers
vim /etc/sudoers
# 大概在 100 行,在 root 下添加如下
Dolphinscheduler ALL=(ALL)
NOPASSWD: NOPASSWD: ALL
3.4 对部署用户配置免密
dolphinscheduler 一键部署原理:在 主机器(下载安装包的机器) 修改好配置文件,通过
scp 方式将后端安装包发送到各个机器,并通过 ssh 方式在部署机器上启动相关服务。故
此处,需要给 主机器上的 部署用户(dolphinscheduler) 配置到 各个服务器的部署用户
(dolphinscheduler) 的免密权限。
su - dolphinscheduler
ssh-keygen -t rsa
cd ~/.ssh && cp id_rsa.pub authorized_keys
chmod 700 authorized_keys
#ssh-copy-id hostname
ssh-copy-id localhost
3.5 dolphinscheduler 安装包下载
# git 下载地址
https://github.com/apache/incubator-dolphinscheduler/releases
# 创建安装目录
sudo mkdir /opt/DolphinScheduler && sudo chown -R dolphinscheduler:dolphinscheduler
/opt/DolphinScheduler
# 下载后端安装包(dolphinscheduler-backend)
wget
https://dist.apache.org/repos/dist/release/incubator/dolphinscheduler/1.2.0/apache-dolphi
nscheduler-incubating-1.2.0-dolphinscheduler-backend-bin.tar.gz
-P
/opt/DolphinScheduler
# 下载前端安装包(dolphinscheduler-ui)
wget
https://dist.apache.org/repos/dist/release/incubator/dolphinscheduler/1.2.0/apache-dolphi
nscheduler-incubating-1.2.0-dolphinscheduler-front-bin.tar.gz -P /opt/DolphinScheduler
四、软件部署
4.1 为 dolphinscheduler 创建 Mysql 数据库
# 设置数据用户 dolphinscheduler 的访问密码为 dolphinscheduler,并且不对访问的 ip
做限制
# 测 试 环 境 将 访 问 设 置 为 所 有 , 如 果 是 生 产 , 可 以 限 制 只 能 子 网 段 的 ip 才 能 访 问
('192.168.1.%')
CREATE DATABASE dolphinscheduler DEFAULT CHARACTER SET utf8 DEFAULT COLLATE
utf8_general_ci;
GRANT ALL PRIVILEGES ON dolphinscheduler.* TO 'dolphinscheduler'@'%' IDENTIFIED BY
'dolphinscheduler';
flush privileges;
4.2 解压 dolphinscheduler 安装包
4.2.1 dolphinscheduler-backend
cd /opt/DolphinScheduler && mkdir dolphinscheduler-backend
tar -zxf apache-dolphinscheduler-incubating-1.2.0-dolphinscheduler-backend-bin.tar.gz
-C dolphinscheduler-backend
# 目录介绍
cd /opt/DolphinScheduler/dolphinscheduler-backend/ && tree -L 1
├── bin
├── conf
├── install.sh
├── lib
├── script
└── sql
# 基础服务启动脚本
# 项目配置文件
# 一键部署脚本
# 项目依赖 jar 包,包括各个模块 jar 和第三方 jar
# 集群启动、停止和服务监控启停脚本
# 项目依赖 sql 文件
4.2.2 dolphinscheduler-ui
cd /opt/DolphinScheduler && mkdir dolphinscheduler-ui
tar -zxf apache-dolphinscheduler-incubating-1.2.0-dolphinscheduler-front-bin.tar.gz -C
dolphinscheduler-ui
cd dolphinscheduler-ui
4.3 dolphinscheduler-backend 部署
4.3.1 修改数据库配置
vim /opt/DolphinScheduler/dolphinscheduler-backend/conf/application-dao.properties
spring.datasource.url=jdbc:mysql://test01:3306/dolphinscheduler?characterEncoding=UT
F-8
spring.datasource.username=dolphinscheduler
spring.datasource.password=dolphinscheduler
s4.3.2 初始化数据库
sh /opt/DolphinScheduler/dolphinscheduler-backend/script/create_dolphinscheduler.sh
# create dolphinscheduler success -> 表示数据库初始化成功
4.3.3 修改环境变量配置
vim /opt/DolphinScheduler/dolphinscheduler-backend/conf/env/.dolphinscheduler_env.sh
# ==========
# CDH 版
# ==========
export HADOOP_HOME=/opt/cloudera/parcels/CDH/lib/hadoop
export HADOOP_CONF_DIR=/opt/cloudera/parcels/CDH/lib/hadoop/etc/hadoop
#export SPARK_HOME1=/opt/cloudera/parcels/CDH/lib/spark
export SPARK_HOME2=/opt/cloudera/parcels/SPARK2
export PYTHON_HOME=/usr/bin/python
export JAVA_HOME=/opt/module/jdk1.8.0_144
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
4.3.4 修改集群部署配置
vim /opt/DolphinScheduler/dolphinscheduler-backend/install.sh
更改配置如下
install.txt
4.3.5 添加 Hadoop 配置文件
# 若 install.sh 中,resUploadStartupType 为 HDFS,且配置为 HA,则需拷贝 hadoop 配
置文件到 conf 目录下
cp
/opt/DolphinScheduler/dolphinscheduler-backend/conf/
cp
/opt/DolphinScheduler/dolphinscheduler-backend/conf/
/etc/hadoop/conf.cloudera.yarn/core-site.xml
/etc/hadoop/conf.cloudera.yarn/hdfs-site.xml
注:若需要修改 hadoop 配置文件,则需拷贝 hadoop 配置文件到 $installPath/conf 目录
下
4.3.6 创建 hdfs 根目录
#sudo -u hdfs hadoop fs -rmr /dolphinscheduler
sudo -u hdfs hadoop fs -mkdir /dolphinscheduler
sudo -u hdfs hadoop fs -chown dolphinscheduler:dolphinscheduler /dolphinscheduler
4.3.7 一键部署
执行脚本部署并启动
sh /opt/DolphinScheduler/dolphinscheduler-backend/install.sh
查看 Java 进程
jps
8138 MasterServer
8165 WorkerServer
8206 LoggerServer
8240 AlertServer
8274 ApiApplicationServer
注:会根据 install.sh 配置情况在对应的机器上启动对应的服务!!!
# master 服务
# worker 服务
# logger 服务
# alert 服务
# api 服务
4.3.8 指令
# 一键部署(含暂停、重发安装包、启动等操作)
sh /opt/DolphinScheduler/dolphinscheduler-backend/install.sh
# 一键启停集群所有服务
/opt/DolphinScheduler/dolphinscheduler/script/start_all.sh
/opt/DolphinScheduler/dolphinscheduler/script/stop_all.sh
/opt/DolphinScheduler/dolphinscheduler/script/dolphinscheduler-daemon.sh
/opt/DolphinScheduler/dolphinscheduler/script/dolphinscheduler-daemon.sh
# 启停 Master
sh
master-server
sh
master-server
# 启停 Worker
start
stop