因业务发展需要,现有数据平台要承担的任务越来越多,迫切需要上线一个易用的调度系统,考虑到要将现有的定时任务从crontab快速迁移到新调度系统,且要易于部署管理,方便扩展,支持HA等要求,近期调研了多款调度系统如airflow以及azkaban,最后发现了一款国产开源的调度系统非常适合我们的需求(最重要还有天生支持中文,不用花时间调神马时区问题,汉化问题,字符编码问题等等一堆糟心问题,哈哈),DolphinScheduler的前身是EasyScheduler,
安装包下载地址:https://dolphinscheduler.apache.org/en-us/docs/user_doc/download.html

1.部署后端
  • 1.1后端安装,支持自动安装,源码编译安装,这里使用自动安装
  • 准备,创建新用户big-data,修改用户权限,赋予sudo权限
$ chmod 640 /etc/sudoers && vim /etc/sudoers 
 #在root    ALL=(ALL)       ALL行下添加:
 big-data  ALL=(ALL)       NOPASSWD: NOPASSWD: ALL
  • 给big-data配置ssh免密(从node1开始,每个节点执行)
node1: ssh-keygen -t rsa
登录各节点执行ssh-keygen -t rsa 一路回车到结束,在~/.ssh/下面会生成一个公钥文件id_rsa.pub
cat  ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys 将公钥追加到authorized_keys
$ chmod 600  ~/.ssh/authorized_keys 修改权限
将 ~/.ssh/authorized_keys从当前节点分发到其他各个节点。如:
scp  ~/.ssh/authorized_keys big-data@hdfs1:~/.ssh/
  • 创建元数据库:
CREATE DATABASE escheduler DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
GRANT ALL PRIVILEGES ON escheduler.* TO 'escheduler'@'%' IDENTIFIED BY 'escheduler';
flush privileges;
  • 创建安装目录:
$ sudo mkdir /opt/dolphinScheduler  
 #修改部署目录权限
 $ chown big-data:big-data  /opt/dolphinScheduler
 $ cd /opt/dolphinScheduler
  • 上传安装包:
  • dolphinscheduler这么提交yarn任务 dolphinscheduler使用_nginx

  • mkdir escheduler #存放后端包解压文件
    mkdir front #存放前端包解压文件
  • dolphinscheduler这么提交yarn任务 dolphinscheduler使用_数据源_02


  • dolphinscheduler这么提交yarn任务 dolphinscheduler使用_hdfs_03

  • 修改配置文件:vim /opt/dolphinScheduler/escheduler/conf/application-dao.properties,创建表和导入基础数据
    注释掉postgre配置,修改mysql配置:spring.datasource.url,username以及password
  • dolphinscheduler这么提交yarn任务 dolphinscheduler使用_nginx_04

  • 执行创建表和导入数据脚本:
    sh backend/script/create-dolphinscheduler.sh 执行过程如遇到如下报错:
    Caused by: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
    将mysql驱动拷贝到lib目录下即可:
  • dolphinscheduler这么提交yarn任务 dolphinscheduler使用_hdfs_05

  • 修改运行参数
    vi conf/env/.dolphinscheduler_env.sh
  • dolphinscheduler这么提交yarn任务 dolphinscheduler使用_nginx_06

  • 修改 install.sh中的各参数,替换成自身业务所需的值
# for example postgresql or mysql ...
dbtype="mysql"
# db address and port
dbhost="slave199:3306"
# db name
dbname="escheduler"
# db username
username="escheduler"
# db passwprd
passowrd="escheduler"
#各节点部署后端服务目录,和当前解压安装包目录不一样
installPath="/opt/dolphinScheduler/backend"
# 部署使用的user,需要有免密sudo权限以及ssh权限
deployUser="big-data"
# zk cluster
zkQuorum="master197:2181,slave198:2181,slave199:2181"
# 需要部署dolphinscheduler的节点
ips="master197,slave198,slave199"
#master节点,可配置多个
masters="slave198"
#worker节点
workers="master197,slave198,slave199"
#alert服务节点
alertServer="slave198"
#api服务节点
apiServers="slave198"
# alert config
# mail protocol
mailProtocol="SMTP"
# mail server host
mailServerHost="smtp.qq.com"
# mail server port
mailServerPort="587"
# sender
mailSender="xxx@qq.com"
# user
mailUser="xxx"
# sender password
mailPassword="passwd"
# TLS
mail.smtp.starttls.enable=true
# SSL
mail.smtp.ssl.enable=false
mail.smtp.ssl.trust=smtp.qq.com
# 资源中心上传选择存储方式:HDFS,S3,NONE
resUploadStartupType="HDFS"
# 如果resUploadStartupType为HDFS,defaultFS写namenode地址,支持HA,需要将core-site.xml和hdfs-site.xml放到conf目录下
# 如果是S3,则写S3地址,比如说:s3a://escheduler,注意,一定要创建根目录/escheduler
defaultFS="hdfs://slave198:8020"
# resourcemanager HA configuration, if it is a single resourcemanager, here is yarnHaIps=""
yarnHaIps="master197,slave199"
#如果是单 resourcemanager,只需要配置一个主机名称,如果是resourcemanager HA,则默认配置就好
singleYarnIp="master197"
#部署scheduler用户的hdfs根路径
hdfsPath="/big-data"
#hdfs集群的root用户
hdfsRootUser="hdfs"
# common config
# Program root path
programPath="/tmp/dolphinscheduler"
# download path
downloadPath="/tmp/dolphinscheduler/download"
# task execute path
execPath="/tmp/dolphinscheduler/exec"
# SHELL environmental variable path
shellEnvPath="$installPath/conf/env/.dolphinscheduler_env.sh"
# suffix of the resource file
resSuffixs="txt,log,sh,conf,cfg,py,java,sql,hql,xml"
  • 将hadoop的配置文件hdfs-site.xml,以及core-site.xml拷贝到conf下:
cp /etc/hadoop/conf/hdfs-site.xml conf/
cp /etc/hadoop/conf/core-site.xml conf/
  • 执行一键安装部署脚本:
    sh install.sh
  • dolphinscheduler后端服务启停脚本:
#启动
  /opt/dolphinScheduler/backend/script/start-all.sh
 #停止
 /opt/dolphinScheduler/backend/script/stop-all.sh
  • 服务成功后,会看到如下相关进程
[big-data@slave198 logs]$ jps
28817 WorkerServer
28995 ApiApplicationServer
28756 MasterServer
28936 AlertServer
28875 LoggerServer
  • 1.2报错解决
    /opt/dolphinScheduler/backend/logs/*.out日志文件中发现有如下错误:

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

  • 将JAVA_HOME/bin下的java软连接到/bin下,(所有节点)
    ln -s $JAVA_HOME/bin/java /bin/java
2.部署前端
  • 2.1下载安装包并解压
cd /opt/dolphinScheduler
  mkdir  front
  tar -zxvf apache-dolphinscheduler-incubating-1.2.0-dolphinscheduler-front-bin.tar.gz -C front
  ```
  • 2.2执行自动化安装部署脚本
    sudo sh ./install-dolphinscheduler-ui.sh

使用自动化部署脚本会检查系统环境是否安装了Nginx,如果没有安装则会通过网络自动下载Nginx包安装,通过引导设置后的Nginx配置文件为 /etc/nginx/conf.d/dolphinscheduler.conf 。

  • 2.3报错解决
安装nginx过程执行firewall-cmd报错:ModuleNotFoundError: No module named 'gi'
vim /usr/bin/firewall-cmd 将#!/usr/bin/python -Es 改为 #!/usr/bin/python2 -Es
vim /usr/sbin/firewalld, 将#!/usr/bin/python -Es 改为 #!/usr/bin/python2 -Es 
#然后重启nginx服务即可!
systemctl restart  nginx
#查看nginx服务状态
systemctl status nginx
#停止nginx服务
systemctl stop nginx
#如果遇到nginx服务启动失败:
#nginx: [error] open() "/run/nginx.pid" failed (2: No such file or directory)
#执行: 
sudo nginx -c /etc/nginx/nginx.conf 
nginx -s reload
#如果报错: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
#找到占用80端口的进程,然后kill掉即可!
netstat -ntlp | grep 80
kill pid
3.开始使用dolphinScheduler
  • 3.1访问:http://slave198:8888/
    使用dolphinscheduler的默认用户密码登录:admin/dolphinscheduler123
  • 3.2创建一个队列:队列管理>>创建队列,输入名称和队列值,然后提交保存
  • 3.3创建租户:租户管理>>创建租户,输入租户编码,名称,选择队列名称,然后提交(注意这里的租户可以是linux系统已经存在的用户)
  • 3.4创建普通用户:用户管理>>创建用户,输入用户名称、密码、租户名和邮箱,手机号选填 然后提交
  • 3.5创建告警组:告警组管理>>创建告警组,输入组名称,类型
  • 3.6切换到test用户登录,然后创建一个项目:项目管理>>
  • 3.7给项目创建工作流:点击新建项目进入项目首页,点击工作流定义>>创建工作流>>点击shell图标(选择项有:SHELL、SUB_PROCESS、PROCEDURE、SQL、SPARK、FLINK、MR、PYTHON、DEPENDENT、HTTP),拖拽到画布,新增一个Shell任务,输入节点名称、描述、脚本;选择运行标志,任务优先级 (级别高的任务在执行队列中会优先执行,相同优先级的任务按照先进先出的顺序执行),超时告警,选择超市策略(当任务执行时间超过超时时长可以告警并且超时失败),填写超时时长 ,然后点击确认添加
  • 3.8保存dag:工作流定义完成后,点击保存,输入dag名称,描述,选择租户,最后添加
  • 3.9执行工作流:刚保存的dag处于下线状态,可以编辑但不能执行,需要上线,才能执行,点击操作栏下的上线图标按钮上线,然后点击运行,需要设置运行参数,参数说明如下:
失败策略:当某一个任务节点执行失败时,其他并行的任务节点需要执行的策略。”继续“表示:其他任务节点正常执行,”结束“表示:终止所有正在执行的任务,并终止整个流程。
通知策略:当流程结束,根据流程状态发送流程执行信息通知邮件。
流程优先级:流程运行的优先级,分五个等级:最高(HIGHEST),高(HIGH),中(MEDIUM),低(LOW),最低(LOWEST)。级别高的流程在执行队列中会优先执行,相同优先级的流程按照先进先出的顺序执行。
worker分组: 这个流程只能在指定的机器组里执行。默认是Default,可以在任一worker上执行。
通知组: 当流程结束,或者发生容错时,会发送流程信息邮件到通知组里所有成员。
收件人:输入邮箱后按回车键保存。当流程结束、发生容错时,会发送告警邮件到收件人列表。
抄送人:输入邮箱后按回车键保存。当流程结束、发生容错时,会抄送告警邮件到抄送人列表。

  • 3.10查看执行结果:点击任务实例可以查看每个任务的列表信息,点击操作栏,查看日志信息。
  • 3.11定时执行工作流:点击工作流定义,找到需要定时执行的任务,点击操作栏下定时图标按钮,选择起止时间,定时周期,失败策略,通知策略等,然后点创建,之后可以看到定时状态位下线,点击定时管理跳到定时管理页,点击上线,上线定时任务,定时任务的执行状态可以在操作栏下树形图中快速浏览到



4.使用worker分组执行任务
worker分组,提供了一种让任务在指定的worker上运行的机制。管理员创建worker分组,在任务节点和运行参数中设置中可以指定该任务运行的worker分组,如果指定的分组被删除或者没有指定分组,则该任务会在任一worker上运行。
worker分组内多个ip地址(不能写别名),以英文逗号分隔。
  • 4.1切换到admin用户登录,点击安全中心>>worker分组管理>>创建worker分组,输入组名称和ip,多个ip之间用英文,分割。提交后可通过操作栏下编辑按钮进行修改。
5.添加数据源
一般SQL脚本执行时会用到多种数据源,例如MySQL、PostgreSQL、Hive、Impala、Spark、ClickHouse、Oracle、SQL Server,
通过添加数据源在DolphinScheduler页面编写Job时直接选择,不用再指定驱动、连接、用户名和密码等信息,
可以快速创建一个SQL脚本的工作流Job,同时这个数据源时用户隔离的,每个用户添加的数据源相互独立(admin用户除外,管理员用户可以看到所有用户添加的数据源)
  • 5.1配置mysql数据源,点击数据源中心 >> 创建数据源,输入名称、主机名、端口、用户名密码、以及库名,然后点击测试连接,成功后点击提交即可.