因业务发展需要,现有数据平台要承担的任务越来越多,迫切需要上线一个易用的调度系统,考虑到要将现有的定时任务从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
-
上传安装包:
mkdir escheduler
#存放后端包解压文件
mkdir front
#存放前端包解压文件
-
修改配置文件:vim /opt/dolphinScheduler/escheduler/conf/application-dao.properties,创建表和导入基础数据
注释掉postgre配置,修改mysql配置:spring.datasource.url,username以及password
-
执行创建表和导入数据脚本:
sh backend/script/create-dolphinscheduler.sh
执行过程如遇到如下报错:
Caused by: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
将mysql驱动拷贝到lib目录下即可:
-
修改运行参数
vi conf/env/.dolphinscheduler_env.sh
-
修改 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数据源,点击数据源中心 >> 创建数据源,输入名称、主机名、端口、用户名密码、以及库名,然后点击测试连接,成功后点击提交即可.