Apache DolphinScheduler 是一个分布式去中心化,易扩展的可视化 DAG 工作流任务调度系统。
致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用。
官网:
https://dolphinscheduler.apache.org/zh-cn/index.html
Git 地址:
https://github.com/apache/incubator-dolphinscheduler
系统架构设计:
https://dolphinscheduler.apache.org/zh-cn/blog/architecture-design.html
系统使用手册:
https://dolphinscheduler.apache.org/zh-cn/docs/user_doc/system-manual.html
FAQ:
https://dolphinscheduler.apache.org/zh-cn/docs/faq.html
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jADgjP0A-1583811365288)(https://analysys.github.io/easyscheduler_docs_cn/images/architecture.jpg)]
MasterServer 采用分布式无中心设计理念,MasterServer 主要负责 DAG 任务切分、任务提交监控,并同时监听其它 MasterServer 和 WorkerServer 的健康状态。 MasterServer 服务启动时向 Zookeeper 注册临时节点,通过 监听 Zookeeper 临时节点 变化来进行容错处理。
该服务内主要包含:
WorkerServer 也采用分布式无中心设计理念,WorkerServer 主要负责 任务的执行和提供日志服务。WorkerServer 服务启动时向 Zookeeper 注册临时节点,并维持心跳。
该服务包含:
ZooKeeper 服务,系统中的 MasterServer 和 WorkerServer 节点都通过 ZooKeeper 来进行 集群管理和容错。另外系统还基于 ZooKeeper 进行 事件监听和分布式锁。 我们也曾经基于Redis实现过队列,不过我们希望 DolphinScheduler 依赖到的组件尽量地少,所以最后还是去掉了 Redis 实现。
提供 任务队列 的操作,目前队列也是基于 Zookeeper 来实现。由于队列中存的信息较少,不必担心队列里数据过多的情况,实际上我们压测过百万级数据存队列,对系统稳定性和性能没影响。
提供 告警相关 接口,接口主要包括告警两种类型的告警数据的存储、查询和通知功能。其中通知功能又有邮件通知和**SNMP(暂未实现)**两种。
API接口层,主要负责 处理前端UI层的请求。该服务统一提供 RESTful api 向外部提供请求服务。 接口包括工作流的创建、定义、查询、修改、发布、下线、手工启动、停止、暂停、恢复、从该节点开始执行等等。
系统的前端页面,提供系统的各种可视化操作界面。
略
软件 | 版本 |
CDH | Cloudera 6.2.0 |
dolphinscheduler | 1.2.0 |
注:
hostname | MasterServer | WorkerServer/LoggerServer | AlertServer | ApiServer | UI |
test01 | √ | ||||
test02 | √ | √ | |||
test03 | √ | √ | √ | √ | √ |
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存储过程需要安装
注意:DolphinScheduler 本身不依赖 Hadoop、Hive、Spark、PostgreSQL,仅是会调用他们的 Client,用于对应任务的运行。
在主服务器(下发DolphinScheduler的机器)上执行以下操作:
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
sudo python get-pip.py
pip --version
pip install kazoo
在所有部署服务器上创建部署用户,并配置 sudo 权限(worker 服务是以 sudo -u {linux-user} 方式来执行作业)
# 创建部署用户
userdel -r dscheduler
useradd dscheduler && echo dscheduler | passwd --stdin dscheduler
# 赋予 sudo 权限
chmod 640 /etc/sudoers
vim /etc/sudoers
# 大概在100行,在root下添加如下
dscheduler ALL=(ALL) NOPASSWD: NOPASSWD: ALL
# 并且需要注释掉 Default requiretty 一行。如果有则注释,没有没有跳过
#Default requiretty
dolphinscheduler 一键部署原理:在 主机器(下载安装包的机器) 修改好配置文件,通过 scp 方式将后端安装包发送到各个机器,并通过 ssh 方式在部署机器上启动相关服务。故此处,需要给 主机器上的 部署用户(dscheduler) 配置到 各个服务器的部署用户(dscheduler) 的免密权限。
su - dscheduler
ssh-keygen -t rsa
cd ~/.ssh && cp id_rsa.pub authorized_keys
chmod 700 authorized_keys
#ssh-copy-id hostname
ssh-copy-id localhost
在主服务器上执行以下操作:
# 创建安装目录
#sudo mkdir /u01/dolphinscheduler && sudo chown -R dscheduler:dscheduler /u01/dolphinscheduler && sudo ln -s /u01/dolphinscheduler /opt/dolphinscheduler
sudo mkdir /opt/dolphinscheduler && sudo chown -R dscheduler:dscheduler /opt/dolphinscheduler
# 下载后端安装包(dolphinscheduler-backend)
wget http://mirror.bit.edu.cn/apache/incubator/dolphinscheduler/1.2.0/apache-dolphinscheduler-incubating-1.2.0-dolphinscheduler-backend-bin.tar.gz -P /opt/dolphinscheduler
# 下载前端安装包(dolphinscheduler-ui)
wget http://mirror.bit.edu.cn/apache/incubator/dolphinscheduler/1.2.0/apache-dolphinscheduler-incubating-1.2.0-dolphinscheduler-front-bin.tar.gz -P /opt/dolphinscheduler
CREATE DATABASE dolphinscheduler DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
GRANT ALL PRIVILEGES ON dolphinscheduler.* TO 'dscheduler'@'10.10.7.%' IDENTIFIED BY 'Ds@12345';
#GRANT ALL PRIVILEGES ON dolphinscheduler.* TO 'dscheduler'@'10.158.1.%' IDENTIFIED BY 'Ds@12345';
#drop user dscheduler@'%';
flush privileges;
cd /opt/dolphinscheduler && tar -zxf apache-dolphinscheduler-incubating-1.2.0-dolphinscheduler-backend-bin.tar.gz
ln -s apache-dolphinscheduler-incubating-1.2.0-dolphinscheduler-backend-bin dolphinscheduler-backend
# 目录介绍
cd dolphinscheduler-backend && tree -L 1
.
├── bin # 基础服务启动脚本
├── conf # 项目配置文件
├── DISCLAIMER-WIP# DISCLAIMER文件
├── install.sh # 一键部署脚本
├── lib # 项目依赖jar包,包括各个模块jar和第三方jar
├── LICENSE # LICENSE文件
├── licenses # 运行时license
├── NOTICE # NOTICE文件
├── script # 集群启动、停止和服务监控启停脚本
└── sql # 项目依赖sql文件
cd /opt/dolphinscheduler && tar -zxf apache-dolphinscheduler-incubating-1.2.0-dolphinscheduler-front-bin.tar.gz
ln -s apache-dolphinscheduler-incubating-1.2.0-dolphinscheduler-front-bin dolphinscheduler-front
修改配置文件
vim /opt/dolphinscheduler/dolphinscheduler-backend/conf/application-dao.properties
# postgre
#spring.datasource.driver-class-name=org.postgresql.Driver
#spring.datasource.url=jdbc:postgresql://192.168.xx.xx:5432/dolphinscheduler
# mysql
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://10.10.7.209:3306/dolphinscheduler?useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=dscheduler
spring.datasource.password=Ds@12345
添加 mysql 驱动
cp /usr/share/java/mysql-connector-java.jar /opt/dolphinscheduler/dolphinscheduler-backend/lib
或
cd /opt/dolphinscheduler && wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.46.tar.gz
tar zxvf mysql-connector-java-5.1.46.tar.gz
cp mysql-connector-java-5.1.46/mysql-connector-java-5.1.46-bin.jar /opt/dolphinscheduler/dolphinscheduler-backend/lib
sh /opt/dolphinscheduler/dolphinscheduler-backend/script/create-dolphinscheduler.sh
# create dolphinscheduler success -> 表示数据库初始化成功
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/CDH/lib/spark
export PYTHON_HOME=/usr/bin/python
export JAVA_HOME=/usr/java/jdk1.8.0_181-cloudera
export HIVE_HOME=/opt/cloudera/parcels/CDH/lib/hive
export FLINK_HOME=/opt/soft/flink
export PATH=$HADOOP_HOME/bin:$SPARK_HOME1/bin:$SPARK_HOME2/bin:$PYTHON_HOME:$JAVA_HOME/bin:$HIVE_HOME/bin:$PATH:$FLINK_HOME/bin:$PATH
cp /opt/dolphinscheduler/dolphinscheduler-backend/install.sh /opt/dolphinscheduler/dolphinscheduler-backend/install.sh_b
vim /opt/dolphinscheduler/dolphinscheduler-backend/install.sh
# 注:以下参数仅为核心部分配置,并未包含 install.sh 脚本全部内容
......................................................
source ${workDir}/conf/config/run_config.conf
source ${workDir}/conf/config/install_config.conf
# 1. 数据库配置
# ${installPath}/conf/quartz.properties
#dbtype="postgresql"
dbtype="mysql"
dbhost="10.10.7.209"
dbname="dolphinscheduler"
username="dscheduler"
# Note: if there are special characters, please use the \ transfer character to transfer
passowrd="Ds@12345"
# 2. 集群部署环境配置
# ${installPath}/conf/config/install_config.conf
installPath="/opt/dolphinscheduler/dolphinscheduler-agent"
# deployment user
# Note: the deployment user needs to have sudo privileges and permissions to operate hdfs. If hdfs is enabled, the root directory needs to be created by itself
deployUser="dscheduler"
# zk cluster
zkQuorum="test01:2181,test02:2181,test03:2181"
# install hosts
ips="test01,test02,test03"
# 3. 各节点服务配置
# ${installPath}/conf/config/run_config.conf
# run master machine
masters="test02,test03"
# run worker machine
workers="test01,test02,test03"
# run alert machine
alertServer="test03"
# run api machine
apiServers="test03"
# 4. alert 配置
# ${installPath}/conf/alert.properties
# 若公司未开启 SSL 服务,可设置: mailServerPort="25" ; starttlsEnable="false" ; sslEnable="false"
# mail protocol
mailProtocol="SMTP"
# mail server host
mailServerHost="smtp.sohh.cn"
# mail server port
mailServerPort="465"
# sender
mailSender="[email protected]"
# user
mailUser="[email protected]"
# sender password
mailPassword="dashuju@123"
# TLS mail protocol support
starttlsEnable="false"
sslTrust="*"
# SSL mail protocol support
# note: The SSL protocol is enabled by default.
# only one of TLS and SSL can be in the true state.
sslEnable="true"
# download excel path
xlsFilePath="/tmp/xls"
# Enterprise WeChat Enterprise ID Configuration
enterpriseWechatCorpId="xxxxxxxxxx"
# Enterprise WeChat application Secret configuration
enterpriseWechatSecret="xxxxxxxxxx"
# Enterprise WeChat Application AgentId Configuration
enterpriseWechatAgentId="xxxxxxxxxx"
# Enterprise WeChat user configuration, multiple users to , split
enterpriseWechatUsers="xxxxx,xxxxx"
# alert port
alertPort=7789
# 5. 开启监控自启动脚本
# 控制是否启动自启动脚本(监控master,worker状态,如果掉线会自动启动)
# whether to start monitoring self-starting scripts
monitorServerState="true"
# 6. 资源中心配置
# ${installPath}/conf/common/ 中
# resource Center upload and select storage method:HDFS,S3,NONE
resUploadStartupType="HDFS"
# if resUploadStartupType is HDFS,defaultFS write namenode address,HA you need to put core-site.xml and hdfs-site.xml in the conf directory.
# if S3,write S3 address,HA,for example :s3a://dolphinscheduler,
# Note,s3 be sure to create the root directory /dolphinscheduler
defaultFS="hdfs://stcluster:8020"
# if S3 is configured, the following configuration is required.
s3Endpoint="http://192.168.xx.xx:9010"
s3AccessKey="xxxxxxxxxx"
s3SecretKey="xxxxxxxxxx"
# resourcemanager HA configuration, if it is a single resourcemanager, here is yarnHaIps=""
yarnHaIps="test03,test02"
# if it is a single resourcemanager, you only need to configure one host name. If it is resourcemanager HA, the default configuration is fine.
singleYarnIp="ark1"
# hdfs root path, the owner of the root path must be the deployment user.
# versions prior to 1.1.0 do not automatically create the hdfs root directory, you need to create it yourself.
hdfsPath="/dolphinscheduler"
# have users who create directory permissions under hdfs root path /
# Note: if kerberos is enabled, hdfsRootUser="" can be used directly.
hdfsRootUser="hdfs"
# 7. common 配置
# ${installPath}/conf/common/common.properties 中
# 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"
# development status, if true, for the SHELL script, you can view the encapsulated SHELL script in the execPath directory.
# If it is false, execute the direct delete
devState="true"
# kerberos config
# kerberos whether to start
kerberosStartUp="false"
# kdc krb5 config file path
krb5ConfPath="$installPath/conf/krb5.conf"
# keytab username
keytabUserName="[email protected]"
# username keytab path
keytabPath="$installPath/conf/hdfs.headless.keytab"
# 8. zk 配置
# ${installPath}/conf/zookeeper.properties
# zk config
# zk root directory
zkRoot="/dolphinscheduler"
# used to record the zk directory of the hanging machine
zkDeadServers="$zkRoot/dead-servers"
# masters directory
zkMasters="$zkRoot/masters"
# workers directory
zkWorkers="$zkRoot/workers"
# zk master distributed lock
mastersLock="$zkRoot/lock/masters"
# zk worker distributed lock
workersLock="$zkRoot/lock/workers"
# zk master fault-tolerant distributed lock
mastersFailover="$zkRoot/lock/failover/masters"
# zk worker fault-tolerant distributed lock
workersFailover="$zkRoot/lock/failover/workers"
# zk master start fault tolerant distributed lock
mastersStartupFailover="$zkRoot/lock/failover/startup-masters"
# zk session timeout
zkSessionTimeout="300"
# zk connection timeout
zkConnectionTimeout="300"
# zk retry interval
zkRetrySleep="100"
# zk retry maximum number of times
zkRetryMaxtime="5"
# 9. master config
# ${installPath}/conf/master.properties
# master execution thread maximum number, maximum parallelism of process instance
masterExecThreads="100"
# the maximum number of master task execution threads, the maximum degree of parallelism for each process instance
masterExecTaskNum="20"
# master heartbeat interval
masterHeartbeatInterval="10"
# master task submission retries
masterTaskCommitRetryTimes="5"
# master task submission retry interval
masterTaskCommitInterval="100"
# master maximum cpu average load, used to determine whether the master has execution capability
masterMaxCpuLoadAvg="10"
# master reserve memory to determine if the master has execution capability
masterReservedMemory="1"
# master port
masterPort=5566
# 10. worker config
# ${installPath}/conf/worker.properties
# worker execution thread
workerExecThreads="100"
# worker heartbeat interval
workerHeartbeatInterval="10"
# worker number of fetch tasks
workerFetchTaskNum="3"
# worker reserve memory to determine if the master has execution capability
workerReservedMemory="1"
# master port
workerPort=7788
# 11. api config
# ${installPath}/conf/application.properties
# api server port
apiServerPort="12345"
# api session timeout
apiServerSessionTimeout="7200"
# api server context path
apiServerContextPath="/dolphinscheduler/"
# spring max file size
springMaxFileSize="1024MB"
# spring max request size
springMaxRequestSize="1024MB"
# api max http post size
apiMaxHttpPostSize="5000000"
# 1,replace file
echo "1,replace file"
......................................................
# 若 install.sh 中,resUploadStartupType 为 HDFS,且配置为 HA,则需拷贝 hadoop 配置文件到 conf 目录下
cp /etc/hadoop/conf.cloudera.yarn/hdfs-site.xml /opt/dolphinscheduler/dolphinscheduler-backend/conf/
cp /etc/hadoop/conf.cloudera.yarn/core-site.xml /opt/dolphinscheduler/dolphinscheduler-backend/conf/
# 若需要修改 hadoop 配置文件,则需拷贝 hadoop 配置文件到 $installPath/conf 目录下,并重启 api-server 服务
#cp /etc/hadoop/conf.cloudera.yarn/hdfs-site.xml /opt/dolphinscheduler/dolphinscheduler-agent/conf/
#cp /etc/hadoop/conf.cloudera.yarn/core-site.xml /opt/dolphinscheduler/dolphinscheduler-agent/conf/
#sh /opt/dolphinscheduler/dolphinscheduler-agent/bin/dolphinscheduler-daemon.sh start api-server
#sh /opt/dolphinscheduler/dolphinscheduler-agent/bin/dolphinscheduler-daemon.sh stop api-server
执行脚本部署并启动
sh /opt/dolphinscheduler/dolphinscheduler-backend/install.sh
查看日志
tree /opt/dolphinscheduler/dolphinscheduler/logs
-------------------------------------------------
/opt/DolphinScheduler/dolphinscheduler/logs
├── dolphinscheduler-alert.log
├── dolphinscheduler-alert-server-node-b.test.com.out
├── dolphinscheduler-alert-server.pid
├── dolphinscheduler-api-server-node-b.test.com.out
├── dolphinscheduler-api-server.log
├── dolphinscheduler-api-server.pid
├── dolphinscheduler-logger-server-node-b.test.com.out
├── dolphinscheduler-logger-server.pid
├── dolphinscheduler-master.log
├── dolphinscheduler-master-server-node-b.test.com.out
├── dolphinscheduler-master-server.pid
├── dolphinscheduler-worker.log
├── dolphinscheduler-worker-server-node-b.test.com.out
├── dolphinscheduler-worker-server.pid
└── {processDefinitionId}
└── {processInstanceId}
└── {taskInstanceId}.log
查看Java进程
jps
8138 MasterServer # master服务
8165 WorkerServer # worker服务
8206 LoggerServer # logger服务
8240 AlertServer # alert服务
8274 ApiApplicationServer # api服务
Worker 启动失败
less /opt/dolphinscheduler/dolphinscheduler-agent/logs/dolphinscheduler-worker-server-test01.out
nohup: 无法运行命令"/bin/java": 没有那个文件或目录
解决方法:创建 java 软链
cd /usr/bin/ && sudo ln -s /usr/java/jdk1.8.0_181-cloudera/bin/java /usr/bin/java
# 一键部署(含暂停、重发安装包、启动等操作)
sh /opt/dolphinscheduler/dolphinscheduler-backend/install.sh
# 一键启停集群所有服务
sh /opt/dolphinscheduler/dolphinscheduler-backend/bin/start-all.sh
sh /opt/dolphinscheduler/dolphinscheduler-backend/bin/stop-all.sh
或
sh /opt/dolphinscheduler/dolphinscheduler-agent/bin/start-all.sh
sh /opt/dolphinscheduler/dolphinscheduler-agent/bin/stop-all.sh
# 启停 Master
sh /opt/dolphinscheduler/dolphinscheduler-agent/bin/dolphinscheduler-daemon.sh start master-server
sh /opt/dolphinscheduler/dolphinscheduler-agent/bin/dolphinscheduler-daemon.sh stop master-server
# 启停 Worker
sh /opt/dolphinscheduler/dolphinscheduler-agent/bin/dolphinscheduler-daemon.sh start worker-server
sh /opt/dolphinscheduler/dolphinscheduler-agent/bin/dolphinscheduler-daemon.sh stop worker-server
# 启停 Api
sh /opt/dolphinscheduler/dolphinscheduler-agent/bin/dolphinscheduler-daemon.sh start api-server
sh /opt/dolphinscheduler/dolphinscheduler-agent/bin/dolphinscheduler-daemon.sh stop api-server
# 启停 Logger
sh /opt/dolphinscheduler/dolphinscheduler-agent/bin/dolphinscheduler-daemon.sh start logger-server
sh /opt/dolphinscheduler/dolphinscheduler-agent/bin/dolphinscheduler-daemon.sh stop logger-server
# 启停Alert
sh /opt/dolphinscheduler/dolphinscheduler-agent/bin/dolphinscheduler-daemon.sh start alert-server
sh /opt/dolphinscheduler/dolphinscheduler-agent/bin/dolphinscheduler-daemon.sh stop alert-server
# 数据库升级是在1.0.2版本增加的功能,执行以下命令即可自动升级数据库
sh /opt/dolphinscheduler/dolphinscheduler-agent/script/upgrade_dolphinscheduler.sh
在部署 ApiApplicationServer 的服务器上部署 UI 服务。
前端部署分自动和手动两种方式:
sudo sh /opt/dolphinscheduler/dolphinscheduler-front/install-dolphinscheduler-ui.sh
············
请输入nginx代理端口,不输入,则默认8888 :8886
请输入api server代理ip,必须输入,例如:192.168.xx.xx :10.10.7.209
请输入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://10.10.7.209:8886
vim /etc/nginx/conf.d/dolphinscheduler.conf
server {
listen 8886;# access port
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /opt/dolphinscheduler/dolphinscheduler-front/dist; # static file directory
index index.html index.html;
}
location /dolphinscheduler {
proxy_pass http://10.10.7.209:12345; # interface address
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 300s;
proxy_read_timeout 300s;
proxy_send_timeout 300s;
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;
}
}
sudo vim /etc/nginx/nginx.conf
# 在 http 内加入
client_max_body_size 1024m;
重启 nginx 服务
systemctl restart nginx
访问 http://10.10.7.209:8886
初始用户:admin
初始密码:dolphinscheduler123
注:若访问网址提示 404,则删除 /etc/nginx/conf.d/default.conf 文件
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum install nginx
systemctl start nginx.service
# 启动
systemctl start nginx
# 重启
systemctl restart nginx
# 状态
systemctl status nginx
# 停止
systemctl stop nginx
说明:队列是在执行 spark、mapreduce 等程序,需要用到“队列”参数时使用的(创建后不可删除)。
详见:附录.队列管理
例:
安全中心 -> 队列管理 -> 创建队列
------------------------------------------------------
名称:quene_test
队列值:quene_test
------------------------------------------------------
提交
说明:
租户对应的是 Linux 的用户,用于 worker 提交作业所使用的用户。
如果 Linux 没有这个用户,worker 会在执行脚本的时候创建这个用户。租户编码:
租户编码是 Linux 上的用户,唯一,不能重复。
新建的租户会在 HDFS 上 $hdfsPath("/dolphinscheduler") 目录下创建租户目录,租户目录下为该租户上传的文件和 UDF 函数租户名称:
租户编码的别名
例:
安全中心 -> 租户管理 -> 创建租户
------------------------------------------------------
租户编码:developer
租户名称:DEFAULT-TENANT
队列值:default
------------------------------------------------------
提交
为该用户在 HDFS 上创建用户目录
sudo -u hdfs hadoop fs -mkdir /user/developer
sudo -u hdfs hadoop fs -chown developer:developer /user/developer
注:
此处为 管理员 创建管理员租户 dscheduler(租户编码:dscheduler 租户名称:WARING-DSCHEDULER)
sudo -u hdfs hadoop fs -mkdir /user/dscheduler
sudo -u hdfs hadoop fs -chown dscheduler:dscheduler /user/dscheduler
说明:用户分为管理员用户和普通用户。
授予权限包括:项目权限,资源权限,数据源权限,UDF函数权限。
管理员可以对普通用户进行非其创建的项目、资源、数据源和UDF函数进行授权。
例:
安全中心 -> 用户管理 -> 创建用户
------------------------------------------------------
用户名称:tourist
密码:DS1234
租户:DEFAULT-TENANT
队列:default
邮箱:[email protected]
手机号:
-----------------------------------------------------+-
提交
注:
实际生产环境中,可将 项目、用户、租户 相关联,即为某个大的项目创建一个用户及对应的租户。若需要删除用户,则应首先将项目内的任务删除,然后删除项目,再删除用户及关联的租户,否则会出现任务无法运行,项目不可见等情况(1.2 版本)
如果该 用户切换租户,则该 用户在当前租户下创建的所有资源 将 复制 到新的租户下(对于 HDFS 平台来说,则是将当前租户目录下该用户创建的所有资源复制到新租户的目录下,不复制被赋权的文件,且被赋权的文件仍有权限)。需要注意的是,此后进行文件删除操作时,旧租户下的对应的文件并不会被删除。
说明:告警组是在启动时设置的参数,在流程结束以后会将流程的状态和其他信息以邮件形式发送给告警组。
例:略
说明:
worker 分组,提供了一种让任务在指定的 worker 上运行的机制。
管理员创建 worker 分组,在任务节点和运行参数中设置中可以指定该任务运行的 worker 分组。
如果指定的分组被删除或者没有指定分组,则该任务会在任意一个 worker 上运行。worker 分组内多个 ip 地址(不能写别名),以英文逗号分隔。
例:
安全中心 -> Worker分组管理 -> 创建Worker分组
------------------------------------------------------
组名称:test01
IP:10.10.7.1
------------------------------------------------------
提交
说明:由于后端接口有登录检查,令牌管理,提供了一种可以通过调用接口的方式对系统进行各种操作。
调用示例:略。详见:附录.令牌管理
略
数据源中心支持MySQL、POSTGRESQL、HIVE及Spark等数据源
例:
数据源中心 -> 创建数据源 -> MYSQL
------------------------------------------------------
数据源名称:test_mysql_mdb
描述:
IP主机名:test03
端口:3306
用户名:testuser
密码:Test@1234
数据库名:mydb
jdbc连接参数:
------------------------------------------------------
测试链接 -> 编辑
略
例:
数据源中心 -> 创建数据源 -> HIVE/IMPALA
------------------------------------------------------
数据源名称:test_hiveserver2
描述:
IP主机名:test03
端口:10000
用户名:hive
密码:12341234
数据库名:mdb
jdbc连接参数:
------------------------------------------------------
测试链接 -> 编辑
例:
数据源中心 -> 创建数据源 -> HIVE/IMPALA
------------------------------------------------------
数据源名称:test_hiveserver2_ha
描述:
IP主机名:test01,test02,test03
端口:2181
用户名:hive
密码:12341234
数据库名:mydb
jdbc连接参数:{"serviceDiscoveryMode":"zooKeeper","zooKeeperNamespace":"hiveserver2_zk"}
------------------------------------------------------
测试链接 -> 编辑
注意:如果开启了kerberos,则需要填写 Principal
略
略
略
略
资源中心所有文件对应的 Mysql 表为:t_ds_resources
UDF 对应的 Mysql 表为:t_ds_udfs
资源中心的文件上传、删除操作使用的用户均为 install.sh 中指定的 $hdfsRootUser
包含创建文件、上传文件、文件查看、下载文件、文件重命名、删除等功能
文件所在 HDFS 上的路径为:$hdfsPath/$tenant/resources/
创建文件支持的文件类型:txt、log、sh、conf、cfg、py、java、sql、xml、hql
上传文件常用于:用户程序,脚本及配置文件
注:
关于文件已存在(resource already exists )问题
文件管理中的文件,有 名称 和 文件名称 两个属性,判断文件是否存在,是根据 名称 进行判断的。
创建文件时,默认为 名称 与 文件名称 同名,若提示已存在,则需修改创建文件操作下的文件名称内容。新建的文件 名称 与 文件名称 都为修改后的文件名。
上传文件时,默认为 名称 与 文件名称 同名,若提示已存在,则需修改文件上传操作下的文件名称内容。上传的文件 名称 为修改后的文件名,文件名称 为上传文件的原文件名。
HDFS 上实际存储的文件,文件名为 名称 显示的内容。
在工作流定义中调用资源时,选取的是此处的 名称 属性。
上传 UDF 资源,同文件管理的上传文件操作。
点击“创建UDF函数”,输入udf函数参数,选择udf资源,点击“提交”,创建udf函数。
注:目前只支持HIVE的 临时 UDF 函数。
项目名称 不可重复。即使为不同用户,创建项目时若 项目名称 已存在。会提示 “project Test already exists”。
若要删除项目,需要确认项目中所有 工作流定义 都已下线并删除,才能进行删除操作。
实际生产环境中,建议使用 管理员账户 创建项目,并对开发人员赋权。
例:
项目管理 -> 创建项目
------------------------------------------------------
项目名称:Demo
描述:
------------------------------------------------------
提交
点击“项目名称”,进入“项目首页”。
注:
工作流定义 的工作流每运行一次,产生一个 工作流实例,一个 工作流实例 包含一到多个 任务实例。同一 任务实例 仅被统计一次,按最近时间状态进行统计。
例:
项目管理 -> 工作流 -> 工作流定义 -> 创建工作流
Step 1:拖拽“SHELL"节点到画布,新增一个Shell任务。
------------------------------------------------------
节点名称:task01
描述:This is a test task.
任务优先级:MEDIUM
Worker分组:Default
失败重试次数:0
失败重试间隔:1
脚本:
#!/bin/sh
echo "HELLO WORLD."
资源:
自定义参数:
------------------------------------------------------
确认添加
Step 2:拖拽“SHELL"节点到画布,新增一个Shell任务。
------------------------------------------------------
节点名称:task02
描述:This is another test task.
任务优先级:MEDIUM
Worker分组:Default
失败重试次数:0
失败重试间隔:1
脚本:
#!/bin/sh
echo "HELLO DOLPHIN SCHEDULER."
资源:
自定义参数:
-> 确认添加
------------------------------------------------------
Step 3:“选择线条连接”,连接任务1、2,tesk01、task02 会串行执行。
Step 4:保存
------------------------------------------------------
设置DAG图名称:Test_shell
选择租户:Default
------------------------------------------------------
-> 添加
更多任务类型详见:六、任务节点类型和参数设置
工作流定义列表的操作功能如下:
工作流运行参数说明:
例:
项目管理 -> 工作流 -> 工作流定义 ->
选择工作流名称“Test_shell” -> 上线 -> 运行(参数均为默认,不做修改)
选择指定工作流,点击“定时”,选择起止时间、定时等选择定时执行时间。
下线 工作流定义 后,定时任务业务也会同时下线,工作流定义 上线后,需要重新手动上线定时任务
点击项目管理->工作流->工作流定义,进入工作流定义页面,点击"导入工作流"按钮,导入本地工作流文件,工作流定义列表显示导入的工作流,状态为下线。
查看工作流实例:
项目管理 -> 工作流 -> 工作流实例 -> 点击工作流名称 -> 进入DAG查看页面,查看任务执行状态
查看任务日志:
进入DAG查看页面 -> 双击任务节点 -> 查看日志
查看任务历史记录:
进入DAG查看页面 -> 双击任务节点 -> 查看历史
查看运行参数:
进入工作流DAG页面 -> 点击左上角图标,查看工作流实例的启动参数、全局参数和局部参数
工作流实例操作功能:
任务实例 -> 点击工作流实例名称 -> 可跳转到工作流实例DAG图查看任务状态
任务实例 -> 查看日志
运行说明:shell 节点,在 worker 执行的时候,会生成一个临时 shell 脚本,使用租户同名的linux 用户执行这个脚本。
参数说明:
例:
项目管理 -> 工作流 -> 工作流定义 -> 创建工作流
------------------------------------------------------
拖拽“SHELL"节点到画布,新增一个Shell任务。
节点名称:Test_shell_01
运行标志:正常
描述:
任务优先级:MEDIUM
Worker分组:Default
失败重试次数:0
失败重试间隔:1
超时告警:off
脚本:
#!/bin/sh
for i in {1..10};do echo $i;done
资源:
自定义参数:
-> 确认添加
------------------------------------------------------
保存 ->
设置DAG图名称:Test_shell
选择租户:Default
超时告警:off
设置全局:
------------------------------------------------------
添加 -> 上线 -> 运行
运行说明:子流程节点,就是把外部的某个工作流定义当做一个任务节点去执行。
参数说明:
例:
项目管理 -> 工作流 -> 工作流定义 -> 创建工作流
------------------------------------------------------
Task 1:拖拽 SHELL 节点到画布,新增一个 Shell 任务
节点名称:Test_subprocess_01
... ...
脚本:
#!/bin/sh
for i in {1..10};do echo $i;done
-> 确认添加
Task 2:拖拽 SUB_PROCESS 节点到画布,新增一个 SUB_PROCESS 任务
节点名称:Test_subprocess_02
... ...
子节点:Test_shell
-> 确认添加
------------------------------------------------------
串联任务节点 Task1 和 Task2
------------------------------------------------------
保存 ->
设置DAG图名称:Test_subprocess
选择租户:Default
超时告警:off
设置全局:
------------------------------------------------------
添加 -> 上线 -> 运行
运行说明:根据选择的数据源,执行存储过程。
参数说明:
例:
Test_procedure(略)
参数说明:
例:
项目管理 -> 工作流 -> 工作流定义 -> 创建工作流
------------------------------------------------------
Task 1:拖拽 SQL 节点到画布,新增一个 SQL 任务
节点名称:Test_sql_mysql_01
... ...
数据源:MYSQL test01_mysql
sql类型:查询 表格:√ 附件:√
主题:Test MySQL
收件人:[email protected]
sql语句:
select * from test_table where score=${i};
自定义参数:
i -> IN -> INTEGER -> 97
前置sql:
INSERT INTO test_table values(null, 'Dog',97)
后置sql:
-> 确认添加
Task 2:拖拽 SQL 节点到画布,新增一个 SQL 任务
节点名称:Test_sql_mysql_02
... ...
数据源:MYSQL test01_mysql
sql类型:非查询
sql语句:
create table test_table2 as select * from test_table;
自定义参数:
前置sql:
后置sql:
-> 确认添加
------------------------------------------------------
串联任务节点 Test_sql_mysql_01、Test_sql_mysql_02
------------------------------------------------------
保存 ->
设置DAG图名称:Test_sql_mysql
选择租户:Default
超时告警:off
设置全局:
------------------------------------------------------
添加 -> 上线 -> 运行
例:
项目管理 -> 工作流 -> 工作流定义 -> 创建工作流
------------------------------------------------------
Task 1:拖拽 SQL 节点到画布,新增一个 SQL 任务
节点名称:Test_sql_hive_01
... ...
数据源:Hive test_hiveserver2
sql类型:查询 表格:√ 附件:√
主题:Test Hive
收件人:[email protected]
sql语句(结尾不要加分号):
select * from test_table where score=${i}
自定义参数:
i -> IN -> INTEGER -> 97
前置sql:
INSERT INTO test_table values(null, 'Dog',97)
后置sql:
-> 确认添加
Task 2:拖拽 SQL 节点到画布,新增一个 SQL 任务
节点名称:Test_sql_hive_02
... ...
数据源:Hive test_hiveserver2_ha
sql类型:非查询
sql语句(结尾不要加分号):
create table test_table2 as select * from test_table
自定义参数:
前置sql:
后置sql:
-> 确认添加
------------------------------------------------------
串联任务节点 Test_sql_hive_01、 Test_sql_hive_02
------------------------------------------------------
保存 ->
设置DAG图名称:Test_sql_hive
选择租户:Default
超时告警:off
设置全局:
------------------------------------------------------
添加 -> 上线 -> 运行
POSTGRESQL、SPARK、CLICKHOUSE、ORACLE、SQLSERVER(略)
执行说明:通过 SPARK 节点,可以直接直接执行 SPARK 程序,对于 spark 节点,worker 会使用 spark-submit 方式提交任务
参数说明:
注意:JAVA和Scala只是用来标识,没有区别,如果是Python开发的Spark则没有主函数的class,其他都是一样
例:略
参数说明:
注意:JAVA和Scala只是用来标识,没有区别,如果是Python开发的Flink则没有主函数的class,其他都是一样
例:略
执行说明:使用 MR 节点,可以直接执行 MR 程序。对于 MR 节点,worker 会使用 hadoop jar 方式提交任务
参数说明:
例:
# 将 MR 的示例 jar 包上传到 资源中心;并创建测试文本上传到 HDFS 目录
# CDH 版本 Jar 包位置:/opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar
项目管理 -> 工作流 -> 工作流定义 -> 创建工作流
------------------------------------------------------
拖拽 MR 节点到画布,新增一个 MR 任务
节点名称:Test_mr_java_01
... ...
程序类型:JAVA
主函数的class:wordcount
主jar包:hadoop-mapreduce-examples.jar
命令行参数:/tmp/test.txt /tmp/output
其他参数:
资源:
自定义参数:
-> 确认添加
------------------------------------------------------
保存 ->
设置DAG图名称:Test_mr_java
选择租户:Default
超时告警:off
设置全局:
------------------------------------------------------
添加 -> 上线 -> 运行(运行MR的权限问题此处不再描述)
------------------------------------------------------
查看结果:
sudo -u hdfs hadoop fs -cat /tmp/output/*
参数说明:
运行说明:使用python节点,可以直接执行python脚本,对于python节点,worker会使用python **方式提交任务。
参数说明:
脚本:用户开发的Python程序
资源:是指脚本中需要调用的资源文件列表
自定义参数:是Python局部的用户自定义参数,会替换脚本中以${变量}的内容
例:
项目管理 -> 工作流 -> 工作流定义 -> 创建工作流
------------------------------------------------------
拖拽 Python 节点到画布,新增一个 Python 任务
节点名称:Test_python_01
... ...
脚本:
#!/user/bin/python
# -*- coding: UTF-8 -*-
for num in range(0, 10): print 'Round %d ...' % num
资源:
自定义参数:
-> 确认添加
------------------------------------------------------
保存 ->
设置DAG图名称:Test_python
选择租户:Default
超时告警:off
设置全局:
------------------------------------------------------
添加 -> 上线 -> 运行
运行说明:依赖节点,就是依赖检查节点。比如A流程依赖昨天的B流程执行成功,依赖节点会去检查B流程在昨天是否有执行成功的实例。
例(摘自官网):例如,A流程为周报任务,B、C流程为天任务,A任务需要B、C任务在上周的每一天都执行成功,如图示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1J7whOxK-1583811365290)(https://analysys.github.io/easyscheduler_docs_cn/images/depend-node2.png)]
假如,周报A同时还需要自身在上周二执行成功:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Orbc0EJV-1583811365290)(https://analysys.github.io/easyscheduler_docs_cn/images/depend-node3.png)]
参数说明:
例:略
时间自定义参数支持代码中自定义变量名,声明方式:${变量名}。可以是引用 “系统参数” 或指定 “常量”。
我们定义这种基准变量为 […] 格式的,[yyyyMMddHHmmss] 是可以任意分解组合的,比如:$[yyyyMMdd], $[HHmmss], $[yyyy-MM-dd] 等。
例:
用户自定义参数分为全局参数和局部参数。
全局参数是保存工作流定义和工作流实例的时候传递的全局参数,全局参数可以在整个流程中的任何一个任务节点的局部参数引用。
例:
项目管理 -> 工作流 -> 工作流定义 -> 创建工作流
------------------------------------------------------
拖拽 Shell 节点到画布,新增一个 Shell 任务
节点名称:Test_parameters
... ...
脚本:
#!/bin/sh
echo "---------------------------------------"
echo "# 时间自定义参数"
echo "后 1 年:" $[add_months(yyyyMMdd, 12*1)]
echo "前 1 年:" $[add_months(yyyyMMdd, -12*1)]
echo "后 1 月:" $[add_months(yyyyMMdd,1)]
echo "前 1 月:" $[add_months(yyyyMMdd,-1)]
echo "后 1 周:" $[yyyyMMdd+7*1]
echo "前 1 周:" $[yyyyMMdd-7*1]
echo "后 1 天:" $[yyyyMMdd+1]
echo "前 1 天:" $[yyyyMMdd-1]
echo "后 1 小时:" $[HHmmss+1/24]
echo "前 1 小时:" $[HHmmss-1/24]
echo "后 1 分钟:" $[HHmmss+1/24/60]
echo "前 1 分钟:" $[HHmmss-1/24/60]
echo "---------------------------------------"
echo "# 用户自定义参数"
echo "dt_yesterday: " ${dt_yesterday}
echo "dt_datetime: " ${dt_datetime}
echo "dt_today: " ${dt_today}
echo "dt_today_global: " ${dt_today_global}
资源:
自定义参数:
dt_yesterday ${system.biz.date}
dt_datetime ${system.datetime}
dt_today ${system.biz.curdate}
-> 确认添加
------------------------------------------------------
保存 ->
设置DAG图名称:Test_parameters
选择租户:Default
超时告警:off
设置全局:
dt_today_global ${system.biz.curdate}
------------------------------------------------------
添加 -> 上线 -> 运行
Q : DolphinScheduler中的队列怎么用,用户队列和租户队列是什么意思
A : DolphinScheduler 中的队列可以在用户或者租户上指定队列,用户指定的队列优先级是高于租户队列的优先级的。例如:对MR任务指定队列,是通过 mapreduce.job.queuename 来指定队列的。
# 注意:MR在用以上方法指定队列的时候,传递参数请使用如下方式:
Configuration conf = new Configuration();
GenericOptionsParser optionParser = new GenericOptionsParser(conf, args);
String[] remainingArgs = optionParser.getRemainingArgs();
# 如果是Spark任务 --queue 方式指定队列
调用示例:
/**
* test token
*/
public void doPOSTParam()throws Exception{
// create HttpClient
CloseableHttpClient httpclient = HttpClients.createDefault();
// create http post request
HttpPost httpPost = new HttpPost("http://127.0.0.1:12345/dolphinscheduler/projects/create");
httpPost.setHeader("token", "123");
// set parameters
List parameters = new ArrayList();
parameters.add(new BasicNameValuePair("projectName", "qzw"));
parameters.add(new BasicNameValuePair("desc", "qzw"));
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(parameters);
httpPost.setEntity(formEntity);
CloseableHttpResponse response = null;
try {
// execute
response = httpclient.execute(httpPost);
// response status code 200
if (response.getStatusLine().getStatusCode() == 200) {
String content = EntityUtils.toString(response.getEntity(), "UTF-8");
System.out.println(content);
}
} finally {
if (response != null) {
response.close();
}
httpclient.close();
}
}
ration conf = new Configuration();
GenericOptionsParser optionParser = new GenericOptionsParser(conf, args);
String[] remainingArgs = optionParser.getRemainingArgs();
# 如果是Spark任务 --queue 方式指定队列
调用示例:
/**
* test token
*/
public void doPOSTParam()throws Exception{
// create HttpClient
CloseableHttpClient httpclient = HttpClients.createDefault();
// create http post request
HttpPost httpPost = new HttpPost("http://127.0.0.1:12345/dolphinscheduler/projects/create");
httpPost.setHeader("token", "123");
// set parameters
List parameters = new ArrayList();
parameters.add(new BasicNameValuePair("projectName", "qzw"));
parameters.add(new BasicNameValuePair("desc", "qzw"));
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(parameters);
httpPost.setEntity(formEntity);
CloseableHttpResponse response = null;
try {
// execute
response = httpclient.execute(httpPost);
// response status code 200
if (response.getStatusLine().getStatusCode() == 200) {
String content = EntityUtils.toString(response.getEntity(), "UTF-8");
System.out.println(content);
}
} finally {
if (response != null) {
response.close();
}
httpclient.close();
}
}