Apache DolphinScheduler 是一个分布式易扩展的可视化DAG工作流任务调度开源系统。适用于企业级场景,提供了一个可视化操作任务、工作流和全生命周期数据处理过程的解决方案。
Apache DolphinScheduler 旨在解决复杂的大数据任务依赖关系,并为应用程序提供数据和各种 OPS 编排中的关系。 解决数据研发ETL依赖错综复杂,无法监控任务健康状态的问题。 DolphinScheduler 以 DAG(Directed Acyclic Graph,DAG)流式方式组装任务,可以及时监控任务的执行状态,支持重试、指定节点恢复失败、暂停、恢复、终止任务等操作。
简单易用
丰富的使用场景
High Reliability
High Scalability
在对 Apache DolphinScheduler 了解之前,我们先来认识一下调度系统常用的名词
DAG: 全称 Directed Acyclic Graph,简称 DAG。工作流中的 Task 任务以有向无环图的形式组装起来,从入度为零的节点进行拓扑遍历,直到无后继节点为止。举例如下图:
流程定义:通过拖拽任务节点并建立任务节点的关联所形成的可视化DAG
流程实例:流程实例是流程定义的实例化,可以通过手动启动或定时调度生成。每运行一次流程定义,产生一个流程实例。
任务实例:任务实例是流程定义中任务节点的实例化,标识着某个具体的任务。
任务类型:目前支持有 SHELL、SQL、SUB_PROCESS(子流程)、PROCEDURE、MR、SPARK、PYTHON、DEPENDENT(依赖),同时计划支持动态插件扩展,注意:其中 SUB_PROCESS类型的任务需要关联另外一个流程定义,被关联的流程定义是可以单独启动执行的
调度方式:系统支持基于 cron 表达式的定时调度和手动调度。命令类型支持:启动工作流、从当前节点开始执行、恢复被容错的工作流、恢复暂停流程、从失败节点开始执行、补数、定时、重跑、暂停、停止、恢复等待线程。 其中 恢复被容错的工作流 和 恢复等待线程 两种命令类型是由调度内部控制使用,外部无法调用
定时调度:系统采用 quartz 分布式调度器,并同时支持cron表达式可视化的生成
依赖:系统不单单支持 DAG 简单的前驱和后继节点之间的依赖,同时还提供任务依赖节点,支持流程间的自定义任务依赖
优先级 :支持流程实例和任务实例的优先级,如果流程实例和任务实例的优先级不设置,则默认是先进先出
邮件告警:支持 SQL任务 查询结果邮件发送,流程实例运行结果邮件告警及容错告警通知
失败策略:对于并行运行的任务,如果有任务失败,提供两种失败策略处理方式,继续是指不管并行运行任务的状态,直到流程失败结束。结束是指一旦发现失败任务,则同时Kill掉正在运行的并行任务,流程失败结束
补数:补历史数据,支持区间并行和串行两种补数方式,其日期选择方式包括日期范围和日期枚举两种
MasterServer
MasterServer采用分布式无中心设计理念,MasterServer主要负责 DAG 任务切分、任务提交监控,并同时监听其它MasterServer和WorkerServer的健康状态。 MasterServer服务启动时向Zookeeper注册临时节点,通过监听Zookeeper临时节点变化来进行容错处理。 MasterServer基于netty提供监听服务。
该服务内主要包含:
DistributedQuartz分布式调度组件,主要负责定时任务的启停操作,当quartz调起任务后,Master内部会有线程池具体负责处理任务的后续操作;
MasterSchedulerService是一个扫描线程,定时扫描数据库中的t_ds_command
表,根据不同的命令类型进行不同的业务操作;
WorkflowExecuteRunnable主要是负责DAG任务切分、任务提交监控、各种不同事件类型的逻辑处理;
TaskExecuteRunnable主要负责任务的处理和持久化,并生成任务事件提交到工作流的事件队列;
EventExecuteService主要负责工作流实例的事件队列的轮询;
StateWheelExecuteThread主要负责工作流和任务超时、任务重试、任务依赖的轮询,并生成对应的工作流或任务事件提交到工作流的事件队列;
FailoverExecuteThread主要负责Master容错和Worker容错的相关逻辑;
WorkerServer
WorkerServer也采用分布式无中心设计理念,WorkerServer主要负责任务的执行和提供日志服务。 WorkerServer服务启动时向Zookeeper注册临时节点,并维持心跳。 Server基于netty提供监听服务。
ZooKeeper
ZooKeeper服务,系统中的MasterServer和WorkerServer节点都通过ZooKeeper来进行集群管理和容错。另外系统还基于ZooKeeper进行事件监听和分布式锁。 我们也曾经基于Redis实现过队列,不过我们希望DolphinScheduler依赖到的组件尽量地少,所以最后还是去掉了Redis实现。
AlertServer
提供告警服务,通过告警插件的方式实现丰富的告警手段。
APIServer
API接口层,主要负责处理前端UI层的请求。该服务统一提供RESTful api向外部提供请求服务。 接口包括工作流的创建、定义、查询、修改、发布、下线、手工启动、停止、暂停、恢复、从该节点开始执行等等。
UI
系统的前端页面,提供系统的各种可视化操作界面。
中心化的设计理念比较简单,分布式集群中的节点按照角色分工,大体上分为两种角色:
中心化思想设计存在的问题:
容错分为服务宕机容错和任务重试,服务宕机容错又分为Master容错和Worker容错两种情况
服务容错设计依赖于ZooKeeper的Watcher机制,实现原理如图:
其中Master监控其他Master和Worker的目录,如果监听到remove事件,则会根据具体的业务逻辑进行流程实例容错或者任务实例容错。
Master容错流程:
Worker容错流程:
handleDeadServer
时会加锁;注意:
由于” 网络抖动”可能会使得节点短时间内失去和ZooKeeper的心跳,从而发生节点的remove事件。对于这种情况,我们使用最简单的方式,那就是节点一旦和ZooKeeper发生超时连接,则直接将Master或Worker服务停掉。
这里首先要区分任务失败重试、流程失败恢复、流程失败重跑的概念:
接下来说正题,我们将工作流中的任务节点分了两种类型。
每一个业务节点都可以配置失败重试的次数,当该任务节点失败,会自动重试,直到成功或者超过配置的重试次数。逻辑节点不支持失败重试。但是逻辑节点里的任务支持重试。
如果工作流中有任务失败达到最大重试次数,工作流就会失败停止,失败的工作流可以手动进行重跑操作或者流程恢复操作
在早期调度设计中,如果没有优先级设计,采用公平调度设计的话,会遇到先行提交的任务可能会和后继提交的任务同时完成的情况,而不能做到设置流程或者任务的优先级,因此我们对此进行了重新设计,目前我们设计如下:
<conversionRule conversionWord="messsage" converterClass="org.apache.dolphinscheduler.service.log.SensitiveDataConverter"/>
<appender name="TASKLOGFILE" class="ch.qos.logback.classic.sift.SiftingAppender">
<filter class="org.apache.dolphinscheduler.service.log.TaskLogFilter"/>
<Discriminator class="org.apache.dolphinscheduler.service.log.TaskLogDiscriminator">
<key>taskAppIdkey>
<logBase>${log.base}logBase>
Discriminator>
<sift>
<appender name="FILE-${taskAppId}" class="ch.qos.logback.core.FileAppender">
<file>${log.base}/${taskAppId}.logfile>
<encoder>
<pattern>
[%level] %date{yyyy-MM-dd HH:mm:ss.SSS Z} [%thread] %logger{96}:[%line] - %messsage%n
pattern>
<charset>UTF-8charset>
encoder>
<append>trueappend>
appender>
sift>
appender>
DolphinScheduler 作为一款开源分布式工作流任务调度系统,可以很好地部署和运行在 Intel 架构服务器及主流虚拟化环境下,并支持主流的Linux操作系统环境
操作系统 | 版本 |
---|---|
Red Hat Enterprise Linux | 7.0 及以上 |
CentOS | 7.0 及以上 |
Oracle Enterprise Linux | 7.0 及以上 |
Ubuntu LTS | 16.04 及以上 |
注意: 以上 Linux 操作系统可运行在物理服务器以及 VMware、KVM、XEN 主流虚拟化环境上
DolphinScheduler 支持运行在 Intel x86-64 架构的 64 位通用硬件服务器平台。对生产环境的服务器硬件配置有以下建议:
生产环境
CPU | 内存 | 硬盘类型 | 网络 | 实例数量 |
---|---|---|---|---|
4核+ | 8 GB+ | SAS | 千兆网卡 | 1+ |
注意:
- 以上建议配置为部署 DolphinScheduler 的最低配置,生产环境强烈推荐使用更高的配置
- 硬盘大小配置建议 50GB+ ,系统盘和数据盘分开
DolphinScheduler正常运行提供如下的网络端口配置:
组件 | 默认端口 | 说明 |
---|---|---|
MasterServer | 5678 | 非通信端口,只需本机端口不冲突即可 |
WorkerServer | 1234 | 非通信端口,只需本机端口不冲突即可 |
ApiApplicationServer | 12345 | 提供后端通信端口 |
注意:
- MasterServer 和 WorkerServer 不需要开启网络间通信,只需本机端口不冲突即可
- 管理员可根据实际环境中 DolphinScheduler 组件部署方案,在网络侧和主机侧开放相关端口
DolphinScheduler 推荐 Chrome 以及使用 Chromium 内核的较新版本浏览器访问前端可视化操作界面
DolphinScheduler提供了4种安装部署方式:
注意:
1、Standalone仅建议20个以下工作流使用,因为其采用内存式的H2 Database, Zookeeper Testing Server,任务过多可能导致不稳定,并且如果重启或者停止standalone-server会导致内存中数据库里的数据清空。 如果您要连接外部数据库,比如mysql或者postgresql。
2、Kubernetes部署先决条件:Helm3.1.0+ ;Kubernetes1.12+;PV 供应(需要基础设施支持)
Standalone 仅适用于 DolphinScheduler 的快速体验.
二进制包下载
二进制包:在下载页面下载 DolphinScheduler 二进制包
前置准备工作
JAVA_HOME
环境变量,并将其下的 bin
目录追加到 PATH
环境变量中。如果你的环境中已存在,可以跳过这步。解压并启动 DolphinScheduler
二进制压缩包中有 standalone 启动的脚本,解压后即可快速启动。切换到有sudo权限的用户,运行脚本
# 解压并运行 Standalone Server
[root@qianfeng01 soft]# cd /opt/soft
[root@qianfeng01 soft]# tar -zxvf apache-dolphinscheduler-3.1.4-bin.tar.gz
[root@qianfeng01 soft]# cd ./apache-dolphinscheduler-3.1.4-bin
[root@qianfeng01 apache-dolphinscheduler-3.1.4-bin]# ./bin/dolphinscheduler-daemon.sh start standalone-server
#查询dolphinscheduler的单机服务
[root@qianfeng01 apache-dolphinscheduler-3.1.4-bin]# jps
18688 Jps
18665 StandaloneServer
登录 DolphinScheduler
浏览器访问地址 http://qianfeng01:12345/dolphinscheduler/ui 即可登录系统UI。默认的用户名和密码是 admin/dolphinscheduler123
登录成功如下图所示:
启停服务
脚本 ./bin/dolphinscheduler-daemon.sh
除了可以快捷启动 standalone 外,还能停止服务运行,全部命令如下
# 启动 Standalone Server 服务
[root@qianfeng01 apache-dolphinscheduler-3.1.4-bin]# ./bin/dolphinscheduler-daemon.sh start standalone-server
# 停止 Standalone Server 服务
[root@qianfeng01 apache-dolphinscheduler-3.1.4-bin]# ./bin/dolphinscheduler-daemon.sh stop standalone-server
配置数据库
Standalone server 使用 H2 数据库作为其元数据存储数据,这是为了上手简单,用户在启动服务器之前不需要启动数据库。但是如果用户想将元数据库存储在 MySQL 或 PostgreSQL 等其他数据库中,他们必须更改一些配置。请参考 数据源配置 Standalone 切换元数据库
创建并初始化数据库。
单机版到此为止即可。
集群模式下,可配置多个Master及多个Worker。通常可配置2~3个Master,若干个Worker。由于集群资源有限,此处配置一个Master,三个Worker,集群规划如下。
主机名 | ip | 服务 | 备注 |
---|---|---|---|
qianfeng01 | 192.168.10.101 | master,worker | |
qianfeng02 | 192.168.10.102 | master,worker | 该服务器也可以安装master |
qianfeng03 | 192.168.10.103 | worker |
操作系统:linux centos 7.7
部署版本:apache-dolphinscheduler-3.1.4-bin
JDK:配置Java环境,将JAVA_HOME配置于PATH中,推荐版本使用jdk8+
数据库:本文使用的是MySQL 8.0.26版本,也可以使用5.7版本及以上,或者是使用PostgreSQL数据库(8.2.15+),两者任选其一即可,如 MySQL 则需要 JDBC Driver 8.0.16
╭liyadong at ~
╰$ scp ~/Desktop/mysql-connector-java-8.0.16.jar qianfeng01:/opt/soft
注册中心:zookeeper(3.4.6+)
其他大数据相关组件:Hadoop 3.3.1 、Hive 3.1.2 、DataX 3.0、Spark 3.1.2等
创建部署用户,并为该用户配置免登录,以创建dolphinscheduler用户为例(准备执行DS安装程序的服务器上创建即可
)
# 创建用户需使用root登录
useradd dolphinscheduler
# 添加密码
echo "dolphinscheduler" | passwd --stdin dolphinscheduler
# 配置sudo(系统管理命令)免密
sed -i '$adolphinscheduler ALL=(ALL) NOPASSWD: NOPASSWD: ALL' /etc/sudoers
sed -i 's/Defaults requirett/#Defaults requirett/g' /etc/sudoers
注意:
- 因为任务执行服务是以
sudo -u {linux-user}
切换不同 linux 用户的方式来实现多租户运行作业,所以部署用户需要有 sudo 权限,而且是免密的。初学习者不理解的话,完全可以暂时忽略这一点- 如果发现
/etc/sudoers
文件中有 “Defaults requirett” 这行,也请注释掉
配置机器SSH免密登陆
由于安装的时候需要向不同机器发送资源,所以要求各台机器间能实现SSH免密登陆。配置免密登陆的步骤如下
su dolphinscheduler
ssh-copy-id qianfeng01
ssh-copy-id qianfeng02
ssh-copy-id qianfeng03
注意:
配置完成后,可以通过运行命令
ssh localhost
判断是否成功,如果不需要输入密码就能ssh登陆则证明成功
启动zookeeper集群(所有安装Zookeper的服务器均执行
)
# 启动 zookeeper
./bin/zkServer.sh start
DolphinScheduler 元数据存储在关系型数据库中,目前支持 PostgreSQL 和 MySQL。下面分别介绍如何使用 MySQL 初始化数据库。
创建数据库、用户和授权
-- 进入MySQL命令行
[root@qianfeng01 soft]# mysql -uroot -p123456
-- 创建dolphinscheduler的数据库用户和密码,并限定登陆范围
mysql> CREATE USER 'dolphinscheduler'@'%' IDENTIFIED BY 'QF-Dolphinscheduler123!';
-- 创建dolphinscheduler的元数据库,并指定编码
mysql> CREATE DATABASE dolphinscheduler DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
-- 为dolphinscheduler数据库授权
mysql> grant all privileges on dolphinscheduler.* to 'dolphinscheduler'@'%' ;
-- 刷新权限
mysql> flush privileges;
解压安装包
上传DolphinScheduler安装包到qianfeng01节点的/opt/software
目录,并解压安装包到该目录。
#上传安装包到服务器
$ scp ~/Desktop/apache-dolphinscheduler-3.1.4-bin.tar.gz qianfeng01:/opt/soft
#解压
[root@qianfeng01 soft]# tar -zxvf ./apache-dolphinscheduler-3.1.4-bin.tar.gz
# 修改目录权限,使得部署用户对二进制包解压后的 apache-dolphinscheduler-*-bin 目录有操作权限
[root@qianfeng01 soft]# chown -R dolphinscheduler:dolphinscheduler apache-dolphinscheduler-3.1.4-bin
添加MySQL驱动
需要手动下载 对应的mysql-connector-java驱动
(8.0.16)并移动到 DolphinScheduler 的每个模块的 libs 目录下,其中包括 api-server/libs
和 alert-server/libs
和 master-server/libs
和 worker-server/libs
和tools/libs
#复制mysql的驱动到对应libs目录中
[root@qianfeng01 soft]# cp ./mysql-connector-java-8.0.16.jar ./apache-dolphinscheduler-3.1.4-bin/alert-server/libs/
[root@qianfeng01 soft]# cp ./mysql-connector-java-8.0.16.jar ./apache-dolphinscheduler-3.1.4-bin/master-server/libs/
[root@qianfeng01 soft]# cp ./mysql-connector-java-8.0.16.jar ./apache-dolphinscheduler-3.1.4-bin/worker-server/libs/
[root@qianfeng01 soft]# cp ./mysql-connector-java-8.0.16.jar ./apache-dolphinscheduler-3.1.4-bin/api-server/libs/
[root@qianfeng01 soft]# cp ./mysql-connector-java-8.0.16.jar ./apache-dolphinscheduler-3.1.4-bin/tools/libs/
修改dolphinscheduler_env.sh
配置文件
文件 ./bin/env/dolphinscheduler_env.sh
描述了下列配置:
JAVA_HOME
和 SPARK_HOME
都是在这里定义的zookeeper
如果您不使用某些任务类型,您可以忽略任务外部依赖项,但您必须根据您的环境更改 JAVA_HOME
、注册中心和数据库相关配置。
#修改内容如下
[root@qianfeng01 soft]# cd ./apache-dolphinscheduler-3.1.4-bin
[root@qianfeng01 apache-dolphinscheduler-3.1.4-bin]# vim ./bin/env/dolphinscheduler_env.sh
# JAVA_HOME, will use it to start DolphinScheduler server
# 改为自己的JDK路径
export JAVA_HOME=${JAVA_HOME:-/usr/local/jdk1.8.0_321}
# Database related configuration, set database type, username and password
# MySQL数据库连接信息
export DATABASE=${DATABASE:-mysql}
export SPRING_PROFILES_ACTIVE=${DATABASE}
export SPRING_DATASOURCE_URL="jdbc:mysql://qianfeng01:3306/dolphinscheduler?useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowPublicKeyRetrieval=true"
export SPRING_DATASOURCE_USERNAME=${SPRING_DATASOURCE_USERNAME:-"dolphinscheduler"}
export SPRING_DATASOURCE_PASSWORD=${SPRING_DATASOURCE_PASSWORD:-"QF-Dolphinscheduler123!"}
# DolphinScheduler server related configuration
# 不用修改
export SPRING_CACHE_TYPE=${SPRING_CACHE_TYPE:-none}
export SPRING_JACKSON_TIME_ZONE=${SPRING_JACKSON_TIME_ZONE:-UTC}
export MASTER_FETCH_COMMAND_NUM=${MASTER_FETCH_COMMAND_NUM:-10}
# Registry center configuration, determines the type and link of the registry center
# zookeeper集群信息
export REGISTRY_TYPE=${REGISTRY_TYPE:-zookeeper}
export REGISTRY_ZOOKEEPER_CONNECT_STRING=${REGISTRY_ZOOKEEPER_CONNECT_STRING:-qianfeng01:2181,qianfeng02:2181,qianfeng03:2181}
# Tasks related configurations, need to change the configuration if you use the related tasks.
# 对已有可以正常配置,没有的保持默认即可
export HADOOP_HOME=${HADOOP_HOME:-/usr/local/hadoop-3.3.1}
export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-/usr/local/hadoop-3.3.1/etc/hadoop}
export SPARK_HOME1=${SPARK_HOME1:-/usr/local/spark-3.1.2}
export SPARK_HOME2=${SPARK_HOME2:-/usr/local/spark-3.1.2}
export PYTHON_HOME=${PYTHON_HOME:-/usr/bin/python}
export HIVE_HOME=${HIVE_HOME:-/usr/local/hive-3.1.2}
export FLINK_HOME=${FLINK_HOME:-/usr/local/flink-1.14.3}
export DATAX_HOME=${DATAX_HOME:-/usr/local/datax}
export SEATUNNEL_HOME=${SEATUNNEL_HOME:-/opt/soft/seatunnel}
export CHUNJUN_HOME=${CHUNJUN_HOME:-/opt/soft/chunjun}
export PATH=$HADOOP_HOME/bin:$SPARK_HOME1/bin:$SPARK_HOME2/bin:$PYTHON_HOME/bin:$JAVA_HOME/bin:$HIVE_HOME/bin:$FLINK_HOME/bin:$DATAX_HOME/bin:$PATH
初始化元数据
# 切换到apache-dolphinscheduler-3.1.4-bin目录下,执行命令
[root@qianfeng01 apache-dolphinscheduler-3.1.4-bin]# sh ./tools/bin/upgrade-schema.sh
完成基础环境和元数据库初始化的准备后,需要根据你的机器环境修改配置文件。配置文件可以在目录 bin/env
中找到,他们分别是 install_env.sh
和 dolphinscheduler_env.sh
。
修改 install_env.sh
文件
文件 install_env.sh
描述了哪些机器将被安装 DolphinScheduler 以及每台机器对应安装哪些服务。您可以在路径 bin/env/install_env.sh
中找到此文件,可通过以下方式更改env变量,export
#修改配置如下
[root@qianfeng01 apache-dolphinscheduler-3.1.4-bin]# vim ./bin/env/install_env.sh
# ---------------------------------------------------------
# INSTALL MACHINE
# ---------------------------------------------------------
# Due to the master, worker, and API server being deployed on a single node, the IP of the server is the machine IP or localhost
ips="qianfeng01,qianfeng02,qianfeng03"
sshPort="22"
# masters可以是一台,也可以是多台,根据自己机器配置决定
masters="qianfeng01,qianfeng02"
workers="qianfeng01:default,qianfeng02:default,qianfeng03:default"
alertServer="qianfeng03"
apiServers="qianfeng01"
# DolphinScheduler installation path, it will auto-create if not exists
# 最终的安装路径
installPath=${installPath:-"/usr/local/dolphinscheduler-3.1.4"}
# Deploy user, use the user you create in section **Configure machine SSH password-free login**
deployUser="dolphinscheduler"
# The root of zookeeper, for now DolphinScheduler default registry server is zookeeper.
zkRoot=${zkRoot:-"/dolphinscheduler"}
使用上面创建的部署用户运行以下命令完成部署,部署后的运行日志将存放在 安装目录下的logs 文件夹内
[root@qianfeng01 apache-dolphinscheduler-3.1.4-bin]# sh ./bin/install.sh
注意:
第一次部署的话,可能出现 5 次sh: bin/dolphinscheduler-daemon.sh: No such file or directory相关信息,为非重要信息直接忽略即可。
第一次安装后会自动启动所有服务的,如有服务问题或者后续需要启停,命令如下。下面的操作脚本都在dolphinScheduler安装目录bin下。
# 一键停止集群所有服务
sh /usr/local/dolphinscheduler-3.1.4/bin/stop-all.sh
# 一键开启集群所有服务
sh /usr/local/dolphinscheduler-3.1.4/bin/start-all.sh
# 启停 Master
sh /usr/local/dolphinscheduler-3.1.4/bin/dolphinscheduler-daemon.sh stop master-server
sh /usr/local/dolphinscheduler-3.1.4/bin/dolphinscheduler-daemon.sh start master-server
# 启停 Worker
sh /usr/local/dolphinscheduler-3.1.4/bin/dolphinscheduler-daemon.sh start worker-server
sh /usr/local/dolphinscheduler-3.1.4/bin/dolphinscheduler-daemon.sh stop worker-server
# 启停 Api
sh /usr/local/dolphinscheduler-3.1.4/bin/dolphinscheduler-daemon.sh start api-server
sh /usr/local/dolphinscheduler-3.1.4/bin/dolphinscheduler-daemon.sh stop api-server
# 启停 Logger
sh /usr/local/dolphinscheduler-3.1.4/bin/dolphinscheduler-daemon.sh start logger-server
sh /usr/local/dolphinscheduler-3.1.4/bin/dolphinscheduler-daemon.sh stop logger-server
# 启停 Alert
sh /usr/local/dolphinscheduler-3.1.4/bin/dolphinscheduler-daemon.sh start alert-server
sh /usr/local/dolphinscheduler-3.1.4/bin/dolphinscheduler-daemon.sh stop alert-server
# 启停 Python Gateway
sh /usr/local/dolphinscheduler-3.1.4/bin/dolphinscheduler-daemon.sh start python-gateway-server
sh /usr/local/dolphinscheduler-3.1.4/bin/dolphinscheduler-daemon.sh stop python-gateway-server
注意:
每个服务在路径
中都有
/conf/dolphinscheduler_env.sh dolphinscheduler_env.sh
文件,这是可以为微 服务需求提供便利。意味着您可以基于不同的环境变量来启动各个服务,只需要在对应服务中配置然后通过
/conf/dolphinscheduler_env.sh 命令启动即可。但是如果您使用命令
/bin/start.sh /bin/dolphinscheduler-daemon.sh start
启动服务器,它将会用文件bin/env/dolphinscheduler_env.sh
覆盖然后启动服务,目的是为了减少用户修改配置的成本.
/conf/dolphinscheduler_env.sh 服务用途请具体参见《系统架构设计》小节。Python gateway service 默认与 api-server 一起启动,如果您不想启动 Python gateway service 请通过更改 api-server 配置文件
api-server/conf/application.yaml
中的python-gateway.enabled : false
来禁用它。
浏览器访问地址 http://qianfeng01:12345/dolphinscheduler/ui 即可登录系统UI。默认的用户名和密码是 admin/dolphinscheduler123
登录如下图所示:
去监控中心查看Masters,如下图所示:
去监控中心查看workers,如下图所示:
到此为止,DolphinScheduler集群安装部署就完成了。
点击顶部导航项目管理--->项目创建--->填写如下信息
在项目列表中—>点击项目名称链接—>进入项目首页—>如下图:
项目首页包含该项目的任务状态统计、流程状态统计、工作流定义统计。这几个指标的说明如下:
创建工作流执行需要的租户
租户就是操作系统的实际用户,ds需要租户来真正执行。
租户创建完成。
点击项目管理->工作流->工作流定义,进入工作流定义页面,点击创建工作流
按钮,进入工作流DAG编辑页面,如下图所示:
添加 Shell 任务的参数设置:
节点名称
,描述
,脚本
字段;运行标志
勾选正常
,若勾选禁止执行
,运行工作流不会执行该任务;任务优先级
:当 worker 线程数不足时,级别高的任务在执行队列中会优先执行,相同优先级的任务按照先进先出的顺序执行;超时时长
,当任务执行时间超过超时时长,会发送告警邮件并且任务超时失败;test.sh
,脚本中调用资源命令为 sh test.sh
。注意调用需要使用资源的全路径;确定
按钮,保存任务设置。配置任务之间的依赖关系: 点击任务节点的右侧加号连接任务;如下图所示,任务 Node_B 和任务 Node_C 并行执行,当任务 Node_A 执行完,任务 Node_B、Node_C 会同时执行。
==注:==上图中Node_B和Node_C是根据Node_A创建方式创建即可,后续的不同类型的工作流的创建也不在一步一步创建。
保存工作流定义: 点击画布右上角的保存
按钮,弹出基本信息
弹框,如下图所示,输入工作流定义名称,工作流定义描述,设置全局变量(选填,参考全局参数),点击确定
按钮,工作流定义创建成功。
其他类型任务,请参考 任务节点类型和参数设置。
并行
:如果对于同一个工作流定义,同时有多个工作流实例,则并行执行工作流实例。串行等待
:如果对于同一个工作流定义,同时有多个工作流实例,则并行执行工作流实例。串行抛弃
:如果对于同一个工作流定义,同时有多个工作流实例,则抛弃后生成的工作流实例并杀掉正在跑的实例。串行优先
:如果对于同一个工作流定义,同时有多个工作流实例,则按照优先级串行执行工作流实例。实时任务的依赖关系: 若DAG中包含了实时任务的组件,则实时任务的关联关系显示为虚线
,在执行工作流实例的时候会跳过实时任务的执行。
**删除任务的依赖关系:**进入DAG图中 ,选中连接线,点击右上角删除
图标,删除任务间的依赖关系。
点击项目管理->工作流->工作流定义,进入工作流定义页面,如下图所示:
编辑: 只能编辑下线
的工作流定义。工作流DAG编辑同创建工作流定义。
上线: 工作流状态为下线
时,上线工作流,只有上线
状态的工作流能运行,但不能编辑。
下线: 工作流状态为上线
时,下线工作流,下线状态的工作流可以编辑,但不能运行。
运行: 只有上线的工作流能运行。运行操作步骤见运行工作流
定时: 只有上线的工作流能设置定时,系统自动定时调度工作流运行。创建定时后的状态为"下线",需在定时管理页面上线定时才生效。定时操作步骤见工作流定时
定时管理: 定时管理页面可编辑、上线/下线、删除定时。
删除: 删除工作流定义。在同一个项目中,只能删除自己创建的工作流定义,其他用户的工作流定义不能进行删除,如果需要删除请联系创建用户或者管理员。
下载: 下载工作流定义到本地。
树形图: 以树形结构展示任务节点的类型及任务状态,如下图所示:
点击项目管理->工作流->工作流定义,进入工作流定义页面,如下图所示,点击上线
按钮,上线工作流。
点击运行
按钮,弹出启动参数设置弹框,如下图所示,设置启动参数,点击弹框中的运行
按钮,工作流开始运行,工作流实例页面生成一条工作流实例。
工作流运行参数说明:
失败策略:当某一个任务节点执行失败时,其他并行的任务节点需要执行的策略。继续
表示:某一任务失败后,其他任务节点正常执行;结束
表示:终止所有正在执行的任务,并终止整个流程。
通知策略:当流程结束,根据流程状态发送流程执行信息通知邮件,包含任何状态都不发,成功发,失败发,成功或失败都发。
流程优先级:流程运行的优先级,分五个等级:最高(HIGHEST),高(HIGH),中(MEDIUM),低(LOW),最低(LOWEST)
。当 master 线程数不足时,级别高的流程在执行队列中会优先执行,相同优先级的流程按照先进先出的顺序执行。
Worker 分组:该流程只能在指定的 worker 机器组里执行。默认是 Default,可以在任一 worker 上执行。
通知组:选择通知策略||超时报警||发生容错时,会发送流程信息或邮件到通知组里的所有成员。
启动参数: 在启动新的流程实例时,设置或覆盖全局参数的值。
补数:指运行指定日期范围内的工作流定义,根据补数策略生成对应的工作流实例,补数策略包括串行补数、并行补数 2 种模式。
日期可以通过页面选择或者手动输入,日期范围是左关右关区间(startDate <= N <= endDate)
串行补数:指定时间范围内,从开始日期至结束日期依次执行补数,依次生成多条流程实例;点击运行工作流,选择串行补数模式:例如从12月 1号到12月20号
依次执行,依次在流程实例页面生成两条流程实例。
调度日期手动输入,在弹出的输入框中输入如下即可:
2022-12-01 00:00:00,2022-12-20 00:00:00
重跑后结果:
并行度:是指在并行补数的模式下,最多并行执行的实例数。例如同时执行7月6号到7月10号的工作流定义,并行度为2,那么流程实例为:
补跑结果如下图:
依赖模式:是否触发下游依赖节点依赖到当前工作流的工作流实例的补数(要求当前补数的工作流实例的定时状态为已上线,只会触发下游直接依赖到当前工作流的补数)。
调度日期手动输入,在弹出的输入框中输入如下即可:
2022-12-01 00:00:00,2022-12-07 00:00:00
依赖模式补数结果如下:
补数与定时配置的关系:
空跑
空跑状态:
任务实例状态:
但是,任务并没有真正执行。
注意:
节点执行类型的选择。
创建定时:点击项目管理->工作流->工作流定义,进入工作流定义页面,上线工作流,点击定时
按钮,弹出定时参数设置弹框,如下图所示:
选择起止时间。在起止时间范围内,定时运行工作流;不在起止时间范围内,不再产生定时工作流实例。
添加一个每天5时执行一次的定时,如下图所示:
失败策略、通知策略、流程优先级、Worker 分组、通知组、收件人、抄送人同工作流运行参数。
点击创建
按钮,创建定时成功,此时定时状态为"下线",定时需上线才生效。
定时上线:点击定时管理
按钮,进入定时管理页面,点击上线
按钮,定时状态变为上线
,如下图所示,工作流定时生效。
工作流定时上线状态
工作流定义列表,选中操作中的导出,如下图:
点击导出后,工作流文件将会被下载到电脑本地。
点击项目管理->工作流->工作流定义,进入工作流定义页面,点击导入工作流
按钮,导入本地工作流文件,工作流定义列表显示导入的工作流,状态为下线。
到此为止,工作流相关的操作就结束了。
工作流复制
复制完成的结果:
注意
复制不包含上下线的状态。
点击项目管理->工作流->工作流实例,进入工作流实例页面,点击工作流名称,进入工作流 DAG 页面;
点击左上角查看变量
,查看工作流实例的全局参数和局部参数;点击左上角启动参数
,查看工作流实例的启动参数,如下图所示
点击项目管理->工作流->工作流实例,进入工作流实例页面,如下图所示:
编辑: 只能编辑成功/失败/停止
状态的流程。点击编辑
按钮或工作流实例名称进入 DAG 编辑页面,编辑后点击保存
按钮,弹出保存 DAG 弹框,如下图所示,修改流程定义信息,在弹框中勾选是否更新工作流定义
,保存后则将实例修改的信息更新到工作流定义;若不勾选,则不更新工作流定义。
重跑: 重新执行已经终止的流程。
恢复失败: 针对失败的流程,可以执行恢复失败操作,从失败的节点开始执行。
停止: 对正在运行的流程进行停止操作,后台会先 kill
worker 进程,再执行 kill -9
操作。
暂停: 对正在运行的流程进行暂停操作,系统状态变为等待执行,会等待正在执行的任务结束,暂停下一个要执行的任务。
恢复暂停: 对暂停的流程恢复,直接从暂停的节点开始运行。
删除: 删除工作流实例及工作流实例下的任务实例。
甘特图: Gantt 图纵轴是某个工作流实例下的任务实例的拓扑排序,横轴是任务实例的运行时间。
批量任务定义允许您在基于任务级别而不是在工作流中操作修改任务。再此之前,我们已经有了工作流级别的任务编辑器,你可以在工作流定义 单击特定的工作流,然后编辑任务的定义。当您想编辑特定的任务定义但不记得它属于哪个工作流时,这是令人沮丧的。所以我们决定在 任务
菜单下添加 任务定义
视图。
在该视图中:
操作
列中的相关按钮来进行编辑、移动、查看版本和删除任务。任务类型
或 工作流程名称
进行查询。项目管理->任务->任务定义->批量任务->创建任务,创建任务试图如下所示:
注意:
上线状态的工作流是不能定义,即你定义也不能保存。
实时任务是在工作流定义中创建Flink_Stream类型的工作流定义,则会在实时任务列表中显示。
点击项目管理->工作流->任务实例,进入任务实例页面,如下图所示,点击工作流实例名称,可跳转到工作流实例DAG图查看任务状态。
点击顶部导航数据源中心--->创建数据源--->数据源选择MySQL--->填写如下信息--->测试连接--->成功--->确定
注意:
数据源中心支持列出、查看、修改、删除等操作。
点击顶部导航数据源中心--->创建数据源--->数据源选择HIVE/UMPALA--->写如下信息--->测试连接--->成功--->确定
注意:如果您希望在同一个会话中执行多个 HIVE SQL,您可以修改配置文件
common.properties
中的配置,设置support.hive.oneSession = true
。 这对运行 HIVE SQL 前设置环境变量的场景会很有帮助。参数support.hive.oneSession
默认值为false
,多条 SQL 将在不同的会话中运行。
Hiveserver2连接错误
通常是在使用hiveserver2或者dolphinscheduler连接hive(hiveserver2服务
)的时候会报错如下:
2023-04-09 00:05:47,328 WARN [main] jdbc.HiveConnection (HiveConnection.java:(237)) - Failed to connect to qianfeng01:10000
Error: Could not open client transport with JDBC Uri: jdbc:hive2://qianfeng01:10000: Failed to open new session: java.lang.RuntimeException: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationException): User: root is not allowed to impersonate root (state=08S01,code=0)
解决办法:
<property>
<name>hadoop.proxyuser.root.hostsname>
<value>*value>
property>
<property>
<name>hadoop.proxyuser.root.groupsname>
<value>*value>
property>
注意:这里登陆的是root用户。若登录的是hadoop用户,则配置文件中的root需要修改为hadoop
当上述文件配置不正确时会可能会引起beeline连接Hive时报如下异常
User: hadoop is not allowed to impersonate root), serverProtocolVersion:null) (state=08S01,code=0)
先部署安装使用的是hadoop用户,故而需要修改core-site.xml配置文件
点击顶部导航数据源中心--->创建数据源--->数据源选择SPARK--->写如下信息--->测试连接--->成功--->确定
注意:如果开启了kerberos,则需要填写 Principal
资源中心通常用于上传文件、UDF 函数和任务组管理
。那资源上传到那儿呢?具体如下:
对于 Standalone 环境,可以选择本地文件目录作为上传文件夹(此操作不需要Hadoop部署)。
当然,你也可以 选择上传到 Hadoop 或者 S3 或者阿里云OSS 等。 在这种情况下,您需要有 Hadoop(2.6+)或等相关环境。
如果您以 集群
模式或者 伪集群
模式部署DolphinScheduler,您需要对以下路径的文件进行配置:api-server/conf/common.properties
和 worker-server/conf/common.properties
;
若您以 单机
模式部署DolphinScheduler,您只需要配置 standalone-server/conf/common.properties
,具体配置如下:
resource.storage.upload.base.path
改为本地存储路径,请确保部署 DolphinScheduler 的用户拥有读写权限,例如:resource.storage.upload.base.path=/tmp/dolphinscheduler
。当路径不存在时会自动创建文件夹resource.storage.type=HDFS
和 resource.hdfs.fs.defaultFS=file:///
。注意:如果您不想用默认值作为资源中心的基础路径,请修改
resource.storage.upload.base.path
的值。
当需要使用资源中心进行相关文件的创建或者上传操作时,所有的文件和资源都会被存储在分布式文件系统HDFS
或者远端的对象存储,如S3
上。所以需要进行以下配置:
配置 common.properties 文件
vim api-server/conf/common.properties和worker-server/conf/common.properties文件均修改如下:
# user data local directory path, please make sure the directory exists and have read write permissions
data.basedir.path=/opt/install/dolphinscheduler-3.1.4/data
# resource view suffixs
#resource.view.suffixs=txt,log,sh,bat,conf,cfg,py,java,sql,xml,hql,properties,json,yml,yaml,ini,js
# resource storage type: HDFS, S3, OSS, NONE
resource.storage.type=HDFS
# resource store on HDFS/S3 path, resource file will store to this base path, self configuration, please make sure the directory exists on hdfs and have read write permissions. "/dolphinscheduler" is recommended
resource.storage.upload.base.path=/dolphinscheduler
# if resource.storage.type=HDFS, the user must have the permission to create directories under the HDFS root path
resource.hdfs.root.user=hdfs
# if resource.storage.type=S3, the value like: s3a://dolphinscheduler; if resource.storage.type=HDFS and namenode HA is enabled, you need to copy core-site.xml and hdfs-site.xml to conf dir
resource.hdfs.fs.defaultFS=hdfs://qianfeng01:9000
# resourcemanager port, the default value is 8088 if not specified
resource.manager.httpaddress.port=8088
# if resourcemanager HA is enabled, please set the HA IPs; if resourcemanager is single, keep this value empty
yarn.resourcemanager.ha.rm.ids=
# if resourcemanager HA is enabled or not use resourcemanager, please keep the default value; If resourcemanager is single, you only need to replace ds1 to actual resourcemanager hostname
yarn.application.status.address=http://qianfeng01:%s/ws/v1/cluster/apps/%s
# job history status url when application number threshold is reached(default 10000, maybe it was set to 1000)
yarn.job.history.status.address=http://qianfeng01:19888/ws/v1/history/mapreduce/jobs/%s
将修改的文件分发到其它服务器
#将./api-server/conf/common.properties分发到02和03服务器
[root@qianfeng01 dolphinscheduler-3.1.4]# scp ./api-server/conf/common.properties qianfeng02:/usr/local/dolphinscheduler-3.1.4/api-server/conf/
[root@qianfeng01 dolphinscheduler-3.1.4]# scp ./api-server/conf/common.properties qianfeng03:/usr/local/dolphinscheduler-3.1.4/api-server/conf/
#将./worker-server/conf/common.properties分发到02和03服务器
[root@qianfeng01 dolphinscheduler-3.1.4]# scp ./worker-server/conf/common.properties qianfeng02:/usr/local/dolphinscheduler-3.1.4/worker-server/conf/
[root@qianfeng01 dolphinscheduler-3.1.4]# scp ./worker-server/conf/common.properties qianfeng03:/usr/local/dolphinscheduler-3.1.4/worker-server/conf/
如Hadoop为HA,则需将Hadoop的core-site.xml和hdfs-site.xml拷贝到worker-server/conf
以及 api-server/conf
中
#本地拷贝到api-server/conf/
[root@bj-zjk-001 dolphinscheduler-3.1.4]# cp /etc/hadoop/conf/core-site.xml /etc/hadoop/conf/hdfs-site.xml /opt/install/dolphinscheduler-3.1.4/api-server/conf/
#远程分发到02和03服务器的api-server/conf/
[root@bj-zjk-001 dolphinscheduler-3.1.4]# scp /etc/hadoop/conf/core-site.xml /etc/hadoop/conf/hdfs-site.xml bj-zjk-002:/opt/install/dolphinscheduler-3.1.4/api-server/conf/
[root@bj-zjk-001 dolphinscheduler-3.1.4]# scp /etc/hadoop/conf/core-site.xml /etc/hadoop/conf/hdfs-site.xml bj-zjk-003:/opt/install/dolphinscheduler-3.1.4/api-server/conf/
#拷贝到worker-server/conf/,一定要有该步骤,否则,将资源中心的资源应用到工作流就会报空指针错误
[root@bj-zjk-001 dolphinscheduler-3.1.4]# cp /etc/hadoop/conf/core-site.xml /etc/hadoop/conf/hdfs-site.xml /opt/install/dolphinscheduler-3.1.4/worker-server/conf/
#远程分发到02和03服务器的worker-server/conf/
[root@bj-zjk-001 dolphinscheduler-3.1.4]# scp /etc/hadoop/conf/core-site.xml /etc/hadoop/conf/hdfs-site.xml bj-zjk-002:/opt/install/dolphinscheduler-3.1.4/worker-server/conf/
[root@bj-zjk-001 dolphinscheduler-3.1.4]# scp /etc/hadoop/conf/core-site.xml /etc/hadoop/conf/hdfs-site.xml bj-zjk-003:/opt/install/dolphinscheduler-3.1.4/worker-server/conf/
创建对应目录
#在HDFS上创建目录
[root@bj-zjk-001 dolphinscheduler-3.1.4]# hdfs dfs -mkdir /dolphinscheduler
#本地每一台服务器创建目录
[root@bj-zjk-001 ~]# mkdir /opt/install/dolphinscheduler-3.1.4/data
[root@bj-zjk-002 ~]# mkdir /opt/install/dolphinscheduler-3.1.4/data
[root@bj-zjk-003 ~]# mkdir /opt/install/dolphinscheduler-3.1.4/data
重新启动DolphinScheduler服务
#停止ds服务
[root@bj-zjk-001 dolphinscheduler-3.1.4]# sh /opt/install/dolphinscheduler-3.1.4/bin/stop-all.sh
#启动ds服务
[root@bj-zjk-001 dolphinscheduler-3.1.4]# sh /opt/install/dolphinscheduler-3.1.4/bin/start-all.sh
注意:
- 如果只配置了
api-server/conf/common.properties
的文件,则只是开启了资源上传的操作,并不能满足正常使用。如果想要在工作流中执行相关文件则需要额外配置worker-server/conf/common.properties
。- 如果用到资源上传的功能,那么安装部署中,部署用户需要有这部分的操作权限。
- 如果 Hadoop 集群的 NameNode 配置了 HA 的话,需要开启 HDFS 类型的资源上传,同时需要将 Hadoop 集群下的
core-site.xml
和hdfs-site.xml
复制到worker-server/conf
以及api-server/conf
,非 NameNode HA 跳过次步骤。
当在调度过程中需要使用到第三方的 jar 或者用户需要自定义脚本的情况,可以通过在该页面完成相关操作。可创建的文件类型包括:txt/log/sh/conf/py/java
等。并且可以对文件进行编辑、重命名、下载和删除等操作。
注意:
基础操作
注意:
- 上传、创建、重命名文件时,文件名和源文件名(上传时)均不能带有
.
以及/
特殊符号。- 上述案例中,关于删除、查看、重命名文件都不再掩饰。
任务案例
该案例主要通过上传一个简单的 shell 脚本,来演示如何在工作流定义中使用资源中心的文件。像 MR、Spark 等任务需要用到 jar 包或者py文件,也是同理。
在项目管理的工作流定义模块,创建一个新的工作流,使用 Shell 任务。
注意:
- 脚本中选择资源文件时文件名称需要保持和所选择资源全路径一致: 例如:资源路径为
/resource/hello.sh
则脚本中调用需要使用/resource/hello.sh
全路径
DolphinScheduler
任务插件有一些公共参数,我们将这些公共参数列在文档中供您查阅。每种任务都有如下的所有或者部分默认参数:
任务参数 | 描述 |
---|---|
任务名称 | 任务的名称,同一个工作流定义中的节点名称不能重复。 |
运行标志 | 标识这个节点是否需要调度执行,如果不需要执行,可以打开禁止执行开关。 |
描述 | 当前节点的功能描述。 |
任务优先级 | worker线程数不足时,根据优先级从高到低依次执行任务,优先级一样时根据先到先得原则执行。 |
Worker分组 | 设置分组后,任务会被分配给worker组的机器机执行。若选择Default,则会随机选择一个worker执行。 |
任务组名称 | 任务资源组,未配置则不生效。 |
组内优先级 | 一个任务组内此任务的优先级。 |
环境名称 | 配置任务执行的环境。 |
失败重试次数 | 任务失败重新提交的次数,可以在下拉菜单中选择或者手动填充。 |
失败重试间隔 | 任务失败重新提交任务的时间间隔,可以在下拉菜单中选择或者手动填充。 |
CPU 配额 | 为执行的任务分配指定的CPU时间配额,单位为百分比,默认-1代表不限制,例如1个核心的CPU满载是100%,16个核心的是1600%。 task.resource.limit.state |
最大内存 | 为执行的任务分配指定的内存大小,超过会触发OOM被Kill同时不会进行自动重试,单位MB,默认-1代表不限制。该功能由 task.resource.limit.state 控制。 |
超时告警 | 设置超时告警、超时失败。当任务超过"超时时长"后,会发送告警邮件并且任务执行失败。该功能由 task.resource.limit.state 控制。 |
资源 | 任务执行时所需资源文件 |
前置任务 | 设置当前任务的前置(上游)任务。 |
延时执行时间 | 任务延迟执行的时间,以分为单位 |
Shell 任务类型,用于创建 Shell 类型的任务并执行一系列的 Shell 脚本。worker 执行该任务的时候,会生成一个临时 shell 脚本,并使用与租户同名的 linux 用户执行这个脚本。
简单打印一行文字
该样例模拟了常见的简单任务,这些任务只需要简单的一两行命令就能运行起来。我们以打印一行日志为例,该任务仅会在日志文件中打印一行 “This is a demo of shell task”
使用自定义参数
该样例模拟了自定义参数任务,为了更方便的复用已有的任务,或者面对动态的需求时,我们会使用变量保证脚本的复用性。本例中,我们先在自定义脚本 中定义了参数 “param_key”,并将他的值设置为 “param_val”。接着在"脚本"中声明了 echo 命令,将参数 “param_key” 打印了出来。当我们保存 并运行任务后,在日志中会看到将参数 “param_key” 对应的值 “param_val” 打印出来。
上线任务,运行后如下:
注意事项
Shell 任务类型通过解析任务日志是否包含
application_xxx_xxx
的内容来判断是否 Yarn 任务,如果是则会将相应的application_id
的状态作为当前 Shell 节点的运行状态判断,此时如果操作停止工作流则会 Kill 相应的application_id
如果 Shell 任务中需要使用到用户自定义的脚本,可通过资源中心来上传对应的文件然后在 Shell 任务中引用他们
SQL任务类型,用于连接数据库并执行相应SQL。
数据源:选择对应的数据源(需要提前创建,请参考数据源中心
)
SQL类型:支持查询和非查询两种。
查询:支持 DML select
类型的命令,是有结果集返回的,可以指定邮件通知为表格、附件或表格附件三种模板;
非查询:支持DDL全部命令 和DML update、delete、insert
三种类型的命令;
分段执行符号:当提供在数据源不支持一次执行多段SQL语句时,拆分SQL语句的符号来进行多次调用数据源执行方法。
例子:
1.当数据源选择Hive数据源时,不需要填写此参数。因为Hive数据源本身支持一次执行多段SQL语句;
2.当数据源选择MySQL数据源时,并且要执行多段SQL语句时,需要填写此参数为分号 ;
。因为MySQL数据源不支持一次执行多段SQL语句;
SQL参数:输入参数格式为key1=value1;key2=value2…
SQL语句:SQL语句
UDF函数:对于HIVE类型的数据源,可以引用资源中心中创建的UDF函数,其他类型的数据源暂不支持UDF函数。
自定义参数:SQL任务类型,而存储过程是自定义参数顺序,给方法设置值自定义参数类型和数据类型,同存储过程任务类型一样。区别在于SQL任务类型自定义参数会替换SQL语句中${变量}。
前置SQL:前置SQL在SQL语句之前执行。
后置SQL:后置SQL在SQL语句之后执行。
MySQL的操作
MySQL的操作就完成了。
Hive表创建并写入数据案例
该样例向Hive中创建临时表tmp_user
并写入一行数据。选择SQL类型为非查询,在创建临时表之前需要确保该表不存在,所以我们使用自定义参数,在每次运行时获取当天时间作为表名后缀,这样这个任务就可以每天运行。创建的表名格式为:tmp_user_{yyyyMMdd}
。
上线运行测试,成功如下图所示。
注意:
biz_date是自定义参数名称;
${system.biz.curdate}是系统内置的当前日期;
${biz_date}是获取自定义参数biz_date的值。
注意SQL类型的选择,如果是INSERT等操作需要选择非查询类型。
为了兼容长会话情况,UDF函数的创建是通过CREATE OR REPLACE语句
查询Hive中结果,登录集群使用hive
命令或使用beeline
、JDBC
、Hue等方式连接apache hive
进行查询,查询SQL为select * from tmp_hello_world_{yyyyMMdd}
,请将{yyyyMMdd}
替换为运行当天的日期,查询结果如下图:
同理,去操作MySQL的SQL语句即可。
使用Hive Cli任务插件
创建Hive Cli
类型的任务执行SQL脚本语句或者SQL任务文件。 执行任务的worker会通过hive -e
命令执行hive SQL脚本语句或者通过hive -f
命令执行资源中心
中的Hive SQL文件。
在DolphinScheduler中,我们有Hive CLI任务插件
和使用Hive数据源的SQL插件
提供用户在不同场景下使用,您可以根据需要进行选择。
Hive CLI任务插件
直接连接HDFS
和Hive Metastore
来执行hive类型的任务,所以需要能够访问到对应的服务。 执行任务的worker节点需要有相应的Hive
jar包以及Hive
和HDFS
的配置文件。 但是在生产调度中,Hive CLI任务插件
能够提供更可靠的稳定性。使用Hive数据源的SQL插件
不需要您在worker节点上有相应的Hive
jar包以及Hive
和HDFS
的配置文件,而且支持 Kerberos
认证。 但是在生产调度中,若调度压力很大,使用这种方式可能会遇到HiveServer2
服务过载失败等问题。Hive小蜜蜂Logo
到画板中,即可完成创建。任务参数 | 描述 |
---|---|
Hive Cli 任务类型 | Hive Cli任务执行方式,可以选择FROM_SCRIPT 或者FROM_FILE 。 |
Hive SQL 脚本 | 手动填入Hive SQL脚本语句。 |
Hive Cli 选项 | Hive Cli的其他选项,如--verbose 。 |
资源 | 如果您选择FROM_FILE 作为Hive Cli任务类型,您需要在资源中选择Hive SQL文件。 |
创建Hive独有的Worker组
因为我们Hive通常不是每一台服务器都部署得有,所以将装有Hive的服务器放到一个worker分组中,在运行工作流的时候,就会将任务跑到指定worker组的服务器上,就不会导致hive命令或者相关依赖找不到的问题。
worker分组就创建成功了。
下面的案例演示了如何使用Hive CLI
任务节点执行Hive SQL脚本语句:
上线并运行:
测试结果如下:
下面的案例演示了如何使用Hive CLI
任务节点从资源中心的Hive SQL
去资源中心创建文件:
创建hive cli的from_file类型的任务:
上线并运行:
运行状态如下图:
具体每个任务的日志,自己看看即可。
Python 任务类型,用于创建 Python 类型的任务并执行一系列的 Python 脚本。worker 执行该任务的时候,会生成一个临时Python脚本, 并使用与租户同名的 Linux 用户执行这个脚本。
任务参数 | 描述 |
---|---|
脚本 | 用户开发的PYTHON程序 |
自定义参数 | 是PYTHON局部的用户自定义参数,会替换脚本中以${变量}的内容 |
使用自定义参数
该样例模拟了自定义参数任务,为了更方便的复用已有的任务,或者面对动态的需求时,我们会使用变量保证脚本的复用性。本例中,我们先在自定义脚本 中定义了参数 “param_key”,并将他的值设置为 “param_val”。接着在"脚本"中使用了 print 函数,将参数 “param_key” 打印了出来。当我们保存 并运行任务后,在日志中会看到将参数 “param_key” 对应的值 “param_val” 打印出来。
print("this is a deamo of python task")
print("${param_key}")
将上述任务保存,然后上线,执行如下图:
Spark 任务类型用于执行 Spark 应用。对于 Spark 节点,Worker 支持两个不同类型的 Spark 命令提交任务:
spark submit
方式提交任务。spark sql
方式提交任务。默认任务参数
一栏。--jar
、--files
、--archives
、--conf
格式。SparkSQL
本案例为创建一个视图表 terms 并写入三行数据和一个格式为 parquet 的表 wc 并判断该表是否存在。程序类型为 SQL。将视图表 terms 的数据插入到格式为 parquet 的表 wc。
SQL代码:
create or replace temporary view terms
as
select * from values("spark hadoop hadoop flink flink ds hadoop")
as tab(content);
create table if not exists wc(word string,cnt int)
using parquet options(path="/tmp/wc.parquet");
insert overwrite table wc
select term,count(term) from (
select explode(split(content,"")) as term
from terms
)
group by term
;
select * from wc;
运行的时候,确保是否配置了Spark的环境变量;
DataX 任务类型,用于执行 DataX 程序。对于 DataX 节点,worker 会通过执行 ${DATAX_HOME}/bin/datax.py
来解析传入的 json 文件。
默认参数说明请参考DolphinScheduler任务参数附录。
任务参数 | 描述 |
---|---|
json | DataX 同步的 json 配置文件 |
资源 | 在使用自定义json中如果集群开启了kerberos认证后,datax读取或者写入hdfs、hbase等插件时需要使用相关的keytab,xml文件等,则可使用改选项。资源中心-文件管理上传或创建的文件 |
自定义参数 | sql 任务类型,而存储过程是自定义参数顺序的给方法设置值自定义参数类型和数据类型同存储过程任务类型一样。区别在于SQL任务类型自定义参数会替换 sql 语句中 ${变量} |
数据源 | 选择抽取数据的数据源 |
sql 语句 | 目标库抽取数据的 sql 语句,节点执行时自动解析 sql 查询列名,映射为目标表同步列名,源表和目标表列名不一致时,可以通过列别名(as)转换 |
目标库 | 选择数据同步的目标库 |
目标库前置 | 前置 sql 在 sql 语句之前执行(目标库执行) |
目标库后置 | 后置 sql 在 sql 语句之后执行(目标库执行) |
限流(字节数) | 限制查询的字节数 |
限流(记录数) | 限制查询的记录数 |
该样例演示为从 MySQL数据导入到 HDFS 中。
在 DolphinScheduler 中配置 DataX 环境
若生产环境中要是使用到 DataX 任务类型,则需要先配置好所需的环境。配置文件如下:/opt/install/dolphinscheduler-3.1.4/bin/env/dolphinscheduler_env.sh
。
vim /opt/install/dolphinscheduler-3.1.4/bin/env/dolphinscheduler_env.sh
export HADOOP_HOME=${HADOOP_HOME:-/usr/local/hadoop-3.3.1}
export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-/usr/local/hadoop-3.3.1/etc/hadoop}
export SPARK_HOME1=${SPARK_HOME1:-/usr/local/spark-3.1.2}
export SPARK_HOME2=${SPARK_HOME2:-/usr/local/spark-3.1.2}
export PYTHON_HOME=${PYTHON_HOME:-/usr/bin/python}
export HIVE_HOME=${HIVE_HOME:-/usr/local/hive-3.1.2}
export FLINK_HOME=${FLINK_HOME:-/usr/local/flink-1.14.3}
export DATAX_HOME=${DATAX_HOME:-/usr/local/datax}
export SEATUNNEL_HOME=${SEATUNNEL_HOME:-/opt/soft/seatunnel}
export CHUNJUN_HOME=${CHUNJUN_HOME:-/opt/soft/chunjun}
export PATH=$HADOOP_HOME/bin:$SPARK_HOME1/bin:$SPARK_HOME2/bin:$PYTHON_HOME/bin:$JAVA_HOME/bin:$HIVE_HOME/bin:$FLINK_HOME/bin:$DATAX_HOME/bin:$SEATUNNEL_HOME/bin:$CHUNJUN_HOME/bin:$PATH
当环境配置完成之后,需要重启 DolphinScheduler。
配置DataX任务
配置从MySQL中将数据抽取到Hive表(对应HDFS目录)中,具体DataX文件如下:
{
"job": {
"setting": {
"speed": {
"channel": 1
}
},
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"username": "root",
"password": "123456",
"connection": [
{
"querySql": ["select * from sexinfo where sid > 0;"],
"jdbcUrl": ["jdbc:mysql://qianfeng01:3306/test"]
}
]
}
},
"writer": {
"name": "hdfswriter",
"parameter": {
"defaultFS": "hdfs://qianfeng01:9000",
"path": "/user/hive/warehouse/sexinfo",
"fileName": "sexdata",
"column": [
{"name": "sid", "type": "int"},
{"name": "stag", "type": "string"}
],
"fileType": "text",
"writeMode": "append",
"fieldDelimiter": ","
}
}
}
]
}
}
具体DS中DataX的任务核心配置如下:
注意:
如果我们将
hdfs-site.xml、core-site.xml和hive-site.xml
三个配置文件放到hdfswriter-0.0.1-SNAPSHOT.jar
中,然后替换服务器该jar包即可,则DataX任务配置中如下这一段json可以去掉:"hadoopConfig":{ "dfs.nameservices": "qianfengns", "dfs.ha.namenodes.qianfeng": "namenode85,namenode111", "dfs.namenode.rpc-address.qianfengns.namenode85": "bj-zjk-001:8020", "dfs.namenode.rpc-address.qianfengns.namenode111": "bj-zjk-002:8020", "dfs.client.failover.proxy.provider.qianfengns": "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider" }
创建DataX的运行Worker组
上线运行,Worker分组选择DataX的
查看运行状态
将DataX任务调度,其运行成功状态如下图所示:
查看HDFS中的数据是否导入
注意:
- DolphinScheudler整合Hadoop、DataX等,服务所占用内存大概需要8G左右,如果单机内存少于8G,估计DataX类型的任务(该任务也耗内存)不能执行。
- 我的qianfeng01虚拟机的内存是12G。可以参考
子流程节点,就是把外部的某个工作流定义
当做一个节点去执行。
任务参数 | 描述 |
---|---|
子节点 | 是选择子流程的工作流定义,右上角进入该子节点可以跳转到所选子流程的工作流定义 |
该样例模拟了常见的任务类型,这里我们使用子结点任务调用 Shell 打印出 ”hello world“。即将一个 shell 任务当作子结点来执行。
创建 shell 任务,并将其保存工作流名称test_dag01
创建一个 shell 任务,用于打印 “hello”。该工作流定义为 test_dag01。
创建 sub_process 任务
在使用 sub_process 的过程中,需要创建所需的子结点任务,也就是我们第一步所创建的 shell 任务。然后如下图所示,在 ⑤ 的位置选择对应的子结点即可。
创建 sub_process 完成之后,再创建一个对应的 shell 任务,用于打印 “world”,并将二者连接起来。
保存当前工作流,并上线运行当前工作流
查看运行状态:
注意事项
在使用 sub_process 调用子结点任务的时候,需要保证定义的子结点为上线状态,否则 sub_process 的工作流无法正常运行。
Dependent 节点,就是依赖检查节点。比如 A 流程依赖昨天的 B 流程执行成功,依赖节点会去检查 B 流程在昨天是否有执行成功的实例。
Dependent 节点提供了逻辑判断功能,可以按照逻辑来检测所依赖节点的执行情况。
例如,A 流程为周报任务,B、C 流程为天任务,A 任务需要 B、C 任务在当天都执行成功。具体流程:
先创建被依赖的test_dag_B和test_dag_C工作流
本步骤不再操作,我这儿创建的shell任务,并且需要提前创建好工作流。
Test_dagC:
创建Dependent任务,核心配置如下:
注意
点击一下上诉的且边上的白色按钮就可以变成或关系。
查看Dependent任务执行状态
更多的依赖配置可参考官网。
Conditions 是一个条件节点,根据上游任务运行状态,判断应该运行哪个下游任务。截止目前 Conditions 支持多个上游任务,但只支持两个下游任务
。当上游任务数超过一个时,可以通过且
以及或
操作符实现复杂上游依赖。
默认参数说明请参考DolphinScheduler任务参数附录。
任务参数 | 描述 |
---|---|
下游任务选择 | 根据前置任务的状态来跳转到对应的分支:成功分支 - 当上游运行成功时,运行成功选择的分支;失败分支 - 当上游运行失败时,运行失败选择的分支 |
上游条件选择 | 可以为 Conditions 任务选择一个或多个上游任务:增加上游依赖 - 通过选择第一个参数选择对应的任务名称,通过第二个参数选择触发的 Conditions 任务的状态;上游任务关系选择 - 当有多个上游任务时,可以通过且 以及或 操作符实现任务的复杂关系。 |
相关任务
switch:Condition节点主要依据上游节点的执行状态(成功、失败)执行对应分支。Switch节点主要依据全局变量的值和用户所编写的表达式判断结果执行对应分支
该样例通过使用 Shell 任务来演示 Condition 任务的操作流程。
创建工作流
进入工作流定义页面,然后分别创建如下任务节点:
查看执行状态
当完成创建工作流之后,可以上线运行该工作流。在工作流实例页面可以查看到各个任务的执行状态。如下图所示:
注意:
Switch 是一个条件判断节点,依据全局变量的值和用户所编写的表达式判断结果执行对应分支。 注意使用 javax.script.ScriptEngine.eval 执行表达式。
点击项目管理 -> 项目名称 -> 工作流定义,点击"创建工作流"按钮,进入 DAG 编辑页面。 拖动工具栏中的 任务节点到画板中即能完成任务创建。
注意
switch 任务创建后,要先配置上下游,才能配置任务分支的参数。
默认参数说明请参考DolphinScheduler任务参数附录。
任务参数 | 描述 |
---|---|
条件 | 可以为 switch 任务配置多个条件,当条件满足时,就会执行指定的分支,可以配置多个不同的条件来满足不同的业务,使用字符串判断时需要使用"" |
分支流转 | 默认的流转内容,当条件中的内容为全部不符合要求时,则运行分支流转中指定的分支 |
这里使用一个 switch 任务以及三个 shell 任务来演示。
创建工作流
新建 switch 任务,以及下游的三个 shell 任务。shell 任务没有要求。 switch 任务需要和下游任务连线配置关系后,才可以进行下游任务的选择
。
设置条件
配置条件和默认分支,满足条件会走指定分支,都不满足则走默认分支。 图中如果变量的值为 “A” 则执行分支 taskA,如果变量的值为 “B” 则执行分支 taskB ,都不满足则执行 default。
条件使用了全局变量,请参考全局变量。 这里配置全局变量的值为 A。
如果执行正确,那么 taskA 会被正确执行。
执行并查看状态
上线并执行,查看是否符合预期。可以看到符合预期,执行了指定的下游任务 taskA。
内置参数,故名思义,是DolphinScheduler系统自带的参数,几乎都是时间相关的参数。分为基础内置和衍生内置参数两类。
基础内置参数
变量名 | 声明方式 | 含义 |
---|---|---|
system.biz.date | ${system.biz.date} | 日常调度实例定时的定时时间前一天,格式为 yyyyMMdd |
system.biz.curdate | ${system.biz.curdate} | 日常调度实例定时的定时时间,格式为 yyyyMMdd |
system.datetime | ${system.datetime} | 日常调度实例定时的定时时间,格式为 yyyyMMddHHmmss |
衍生内置参数
作用域
全局参数是指针对整个工作流的所有任务节点都有效的参数,在工作流定义页面配置。
使用方式
具体的使用方式可结合实际的生产情况而定,这里演示为使用 Shell 任务打印出前一天的日期。
创建 Shell 任务
创建一个 Shell 任务,并在脚本内容中输入 echo ${dt}
。此时 dt 则为我们需要声明的全局参数。如下图所示:
保存工作流,并设置全局参数
全局参数配置方式如下:在工作流定义页面,点击“设置全局”右边的加号,填写对应的变量名称和对应的值,保存即可。
如下图所示:
注意:
- 这里定义的 dt 参数可以被其它任一节点的局部参数引用。
- 传递参数时,使用$[…]符号
- 全局变量的值,出了时间,还可以设置别的类型值。
任务实例的执行结果查看
进入任务实例页面,可以通过查看日志,验证任务的执行结果,判断参数是否有效。
作用域
在任务定义页面配置的参数,默认作用域仅限该任务,如果配置了参数传递则可将该参数作用到下游任务中。
使用方式
本地参数配置方式如下:在任务定义页面,点击“自定义参数”右边的加号,填写对应的变量名称和对应的值,保存即可。
setValue
和自定义参数 export 本地参数setValue
和自定义参数 export 本地参数setValue
和 Bash 环境变量参数 export 本地参数任务案例
通过自定义参数使用
本样例展示了如何使用本地参数,打印输出当前日期。创建一个 Shell 任务,并编写脚本内容为 echo ${dt}
。点击配置栏中的自定义参数,配置如下图所示:
参数说明:
保存工作流并运行,查看 Shell 任务输出日志。
注意:
本地参数可以在当前任务节点的工作流中,设置其为 OUT 则可以传递给下游的工作流使用,可以参考:参数传递
通过setValue export本地参数
如果你想简单 export 参数然后在下游任务中使用它们,你可以在你的任务中使用 setValue
,你可以将参数统一在一个任务中管理。在 Shell 任务中使用语法 echo '${setValue(set_val=123)}'
(不要忘记单引号) 并添加新的 OUT
自定义参数来 export 它。
你可以在下游任务中使用语法 echo '${set_val}'
在获取设定的值。
通过setValue和自定义参数export本地参数
如果你想用自定义参数而不是常量值来实现参数 export,并下游任务中使用它们,你可以在通过 setValue
和 自定义参数实现,当你想改变参数的值时可以直接改变 “自定义参数”模块中的值,这让程序更加容易维护。您可以在 Shell 任务中使用语法 echo '#{setValue(set_val_param=${param})}'
(如果你想要将任何 变量赋值给 setValue
请不要忘记使用单引号)并添加新的 IN
自定义参数用于输入变量 val
和 OUT
自定义参数用于 export 参数 set_val_param
。
你可以在下游任务中使用语法 echo '${set_val_param}'
在获取设定的值。
通过setValue和Bash环境变量参数export本地参数
如果你想用 bash 变量而不是常量值 export 参数,并在下游任务中使用它们,你可以在通过 setValue
和 Bash 变量实现,它更灵活,例如你动态获取现有的本地 或 HTTP 资源获取设定变量。 您可以使用类似的语法
lines_num=$(wget https://raw.githubusercontent.com/apache/dolphinscheduler/dev/README.md -q -O - | wc -l | xargs)
echo "#{setValue(set_val_var=${lines_num})}"
在 Shell 任务中(如果你想要将任何变量赋值给 setValue
请不要忘记使用双引号)和 OUT
自定义参数用于 export 参数 set_val_var
。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tCzjfaFO-1683341767429)(https://yadongli-oss.oss-cn-beijing.aliyuncs.com/img/image-20230311155728293.png)]
你可以在下游任务中使用语法 echo '${set_val_var}'
在获取设定的值。
DolphinScheduler 提供参数间相互引用的能力,包括:本地参数引用全局参数、上下游参数传递。因为有引用的存在,就涉及当参数名相同时,参数的优先级问题。
本地任务引用全局参数
本地任务引用全局参数的前提是,你已经定义了全局参数,使用方式和本地参数中的使用方式类似,但是参数的值需要配置成全局参数中的 key。
上游任务传递给下游任务
DolphinScheduler 允许在任务间进行参数传递,目前传递方向仅支持上游单向传递给下游。目前支持这个特性的任务类型有:
当定义上游节点时,如果有需要将该节点的结果传递给有依赖关系的下游节点,需要在【当前节点设置】的【自定义参数】设置一个方向是 OUT 的变量。目前我们主要针对 SQL 和 SHELL 节点做了可以向下传递参数的功能。
注意:
若节点之间没有依赖关系,则局部参数无法通过上游传递。
任务案例
展示了如何使用参数传递的功能,通过 SHELL 任务来创建本地参数并赋值传递给下游,SQL 任务通过获得上游任务的参数完成查询操作。
创建Shell任务,并设置参数
用户需要传递参数,在定义 SHELL 脚本时,需要输出格式为 ${setValue(key=value)} 的语句,key 为对应参数的 prop,value 为该参数的值。
创建 Node_A1 任务,在自定义参数中添加 output 和 value 参数,并编写如下脚本:
参数说明:
'${setValue(output=1)}'
赋值,并传递给下游参数SHELL 节点定义时当日志检测到 ${setValue(output=1)} 的格式时,会将 1 赋值给 output,下游节点便可以直接使用变量 output 的值。同样,您可以在【工作流实例】页面,找到对应的节点实例,便可以查看该变量的值。
创建 Node_B 任务,主要用于测试输出上游任务 Node_A 传递的参数。
创建SQL并使用参数
完成上述的 SHELL 任务之后,我们可以使用上游所传递的 output 作为 SQL 的查询对象。其中将所查询的 id 重命名为 ID,作为参数输出。
注意:
- 如果 SQL 节点的结果只有一行,一个或多个字段,参数的名字需要和字段名称一致。数据类型可选择为除 LIST 以外的其他类型。变量会选择 SQL 查询结果中的列名中与该变量名称相同的列对应的值。
- 如果 SQL 节点的结果为多行,一个或多个字段,参数的名字需要和字段名称一致。数据类型选择为 LIST。获取到 SQL 查询结果后会将对应列转化为 LIST,并将该结果转化为 JSON 后作为对应变量的值。
DolphinScheduler 中所涉及的参数值的定义可能来自三种类型:
因为参数的值存在多个来源,当参数名相同时,就需要会存在参数优先级的问题。DolphinScheduler 参数的优先级从高到低为:本地参数 > 上游任务传递的参数 > 全局参数
在上游任务传递的参数中,由于上游可能存在多个任务向下游传递参数,当上游传递的参数名称相同时:
下面案例向你展示如何使用任务参数传递的优先级问题
先以 Shell 节点解释第一种情况
节点 【useParam】可以使用到节点【createParam】中设置的变量。而节点 【useParam】与节点【noUseParam】中并没有依赖关系,所以并不会获取到节点【noUseParam】的变量。下图中只是以 shell 节点作为例子,其他类型节点具有相同的使用规则。
NoUseParam配置:
CreateParam配置:
UseParam配置:
保存工作流:
上线运行结果依次如下:
到此为止,参数优先级案例就完成了,可以适当修改提交上线,观察结果。
告警就是相关任务或者工作流成功、失败等发出告警,具体支持的告警为:
登陆个人邮箱
登陆地址:https://mail.163.com/,输入用户名密码,登陆后进入邮箱主界面
在顶部导航栏选择设置
选择开启服务
开启服务
点击继续开启,我使用扫描二维码,然后会弹出发送短信(内容和发送号码都已经自动生成好
),点击发送短信即可,发完两三秒后,就可以点击下图的2步骤(我已发送):
成功验证,即识别到你发送的短信后,会弹出如下图,包含授权码,相当于密码:
登陆飞书,进入主页面—>找到一个群组(用于接收DS告警消息)
找到添加机器人
点击群机器人后,如下图:
点击添加机器人:
添加机器人进群
第一步:添加自定义机器人进群
第二步:配置webhook(每个机器人都有一个webhook
)
点击完成,然后弹窗中点击我知道了
,到此则设置完成了飞书的群机器人。
到此为止,feishu告警实例已经创建成功。
创建dingTalk实例:
至于其他的告警实例,大家可以根据自己企业的需要,选择用对应的插件,创建对应的告警实例即可。
告警组可以包含多个告警实例,这样就可以将任务或者工作流运行的信息发送给对应的告警组。
创建邮件告警组
创建飞书告警组
创建钉钉告警组
创建飞书和钉钉的告警组
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nzzv1l0W-1683341767433)(https://yadongli-oss.oss-cn-beijing.aliyuncs.com/img/image-20230420195736626.png)]
到此为止,告警组都创建成功。
注意:
Default admin warning group为默认的告警组,不能删除。
飞书告警组应用
将以前的任何一个作业提交上线,然后选择刚才配置的告警组即可,具体如下图所示:
告警的核心应用配置是第4、5步骤,告警结果如下:
钉钉和飞书告警组应用
工作流上线运行并配置钉钉告警组:
查看钉钉群聊和飞书群聊中,是否有任务执行信息:
到此为止,我们的告警组测试就完成了。
服务管理主要是对系统中的各个服务的健康状况和基本信息的监控和显示。
Statistics
主要是相关命令数指标统计。
审计日志
审计日志的记录提供了有关谁访问了系统,以及他或她在给定时间段内执行了哪些操作的信息,他对于维护安全都很有用。
队列是在执行 Mapreduce 、Hive、Spark、Flink等程序,需要用到队列
参数时使用的。
此处的队列对应的是YARN
调度器的资源队列,队列概念只对跑在YARN上的任务类型有效。此处创建出的队列,可供后续任务进行选择。此处可不创建队列。
管理员进入安全中心 -> 队列管理页面,点击“创建队列”按钮,创建队列。
注意:
- 在DolphinScheduler中创建队列,并不会影响到YARN调度器的队列配置。
- 该处创建的队列暂时不支持删除操作。
租户对应的是Linux 的用户,用于 Worker 提交作业所使用的用户。如果 Linux 没有这个用户,则会导致任务运行失败。你可以通过修改 worker.properties
配置文件中参数 worker.tenant.auto.create=true
实现当 Linux 用户不存在时自动创建该用户。worker.tenant.auto.create=true
参数会要求 worker 可以免密运行 sudo
命令。
租户编码:租户编码是 Linux上 的用户,唯一,不能重复。
管理员进入安全中心->租户管理页面,点击“创建租户”按钮,创建租户。
租户可以进行修改和删除操作。
用户分为管理员用户和普通用户
进入安全中心->用户管理页面,点击“创建用户”按钮,创建用户。
用户管理可以进行授权、编辑和删除用户等信息。
注意:
- 如果该用户切换了租户,则该用户所在租户下所有资源将复制到切换的新租户下。
- 默认admin就是管理员,不能删除。
授予权限包括项目权限,资源权限,数据源权限,UDF函数权限,k8s命名空间。
管理员可以对普通用户进行非其创建的项目、资源、数据源、UDF函数、k8s命名空间。因为项目、资源、数据源、UDF函数、k8s命名空间授权方式都是一样的,所以以项目授权为例介绍。
注意:对于用户自己创建的项目,该用户拥有所有的权限。则项目列表和已选项目列表中不会显示。
管理员进入安全中心->用户管理页面,点击需授权用户的“授权”按钮,如下图所示:
选择授权项目:
资源、数据源、UDF 函数和命名空间等授权同项目授权类似。
由于DS后端接口有登录检查,令牌管理提供了一种可以通过调用接口的方式对DS系统进行各种操作。
管理员进入安全中心->令牌管理页面,点击“创建令牌”按钮,选择失效时间与用户,点击"生成令牌"按钮,点击"提交"按钮,则选择用户的token创建成功。
普通用户登录后,点击用户名下拉框中的用户信息,进入令牌管理页面,选择失效时间,点击"生成令牌"按钮,点击"提交"按钮,则该用户创建 token 成功。
调用示例:
/**
* 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/escheduler/projects/create");
httpPost.setHeader("token", "5ba791ca49155158e540b01313b181ec");
// set parameters
List<NameValuePair> parameters = new ArrayList<NameValuePair>();
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();
}
}
切换普通用户登陆效果如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MV09k2gl-1683341767434)(https://yadongli-oss.oss-cn-beijing.aliyuncs.com/img/image-20230315172650994.png)]
注意:
普通用户自己对这个token是没有编辑、更新、删除等权限,只有查看和应用权限。
每个 worker 节点都会归属于自己的 worker 分组,默认分组为 default
。
在任务执行时,可以将任务分配给指定 worker 分组,最终由该组中的 worker 节点执行该任务。
注意
- default是默认分组,包含所有的worker,可以通过配置进行更新。
- default分组不支持删除。
- 关于相同的Worker被多个分组共享时,他们的资源应用情况也会被进行共享。
在线配置 worker 运行环境,一个 worker 可以指定多个环境,每个环境等价于 dolphinscheduler_env.sh 文件.
默认环境为dolphinscheduler_env.sh文件.
在任务执行时,可以将任务分配给指定 worker 分组,根据 worker 分组选择对应的环境,最终由该组中的 worker 节点执行环境后执行该任务.
创建/更新 环境
环境配置等价于dolphinscheduler_env.sh文件内配置
在 环境管理中配置 Hive相关环境
export HADOOP_HOME=${HADOOP_HOME:-/usr/local/hadoop-3.3.1}
export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-/usr/local/hadoop-3.3.1/etc/hadoop}
export SPARK_HOME1=${SPARK_HOME1:-/usr/local/spark-3.1.2}
export SPARK_HOME2=${SPARK_HOME2:-/usr/local/spark-3.1.2}
export PYTHON_HOME=${PYTHON_HOME:-/usr/bin/python}
export HIVE_HOME=${HIVE_HOME:-/usr/local/hive-3.1.2}
export FLINK_HOME=${FLINK_HOME:-/usr/local/flink-1.14.3}
export DATAX_HOME=${DATAX_HOME:-/usr/local/datax}
export SEATUNNEL_HOME=${SEATUNNEL_HOME:-/opt/soft/seatunnel}
export CHUNJUN_HOME=${CHUNJUN_HOME:-/opt/soft/chunjun}
export PATH=$HADOOP_HOME/bin:$SPARK_HOME1/bin:$SPARK_HOME2/bin:$PYTHON_HOME/bin:$JAVA_HOME/bin:$HIVE_HOME/bin:$FLINK_HOME/bin:$DATAX_HOME/bin:$SEATUNNEL_HOME/bin:$CHUNJUN_HOME/bin:$PATH
创建如下图所示:
使用环境
在工作流定义中创建任务节点选择 worker 分组和 worker 分组对应的环境,任务执行时 worker 会先执行环境在执行任务。
注意:
当无法在任务定义或工作流运行对话框中使用你想要使用的环境时,请检查您已经选择worker,并且您要使用的环境已经关联到您选择的worker中。
创建/更新 集群
每个工作流可以绑定零到若干个集群用来支持多集群,目前先用于k8s。
使用集群
创建和授权后,k8s命名空间和工作流会增加关联集群的功能。每一个集群会有独立的工作流和任务实例独立运行。
创建/更新 k8s集群
先把k8s集群连接的配置录入 database 的表 t_ds_k8s
给批次使用后续移除,namespace的创建现在通过下拉选择集群。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-woKVi2lx-1683341767435)(https://yadongli-oss.oss-cn-beijing.aliyuncs.com/img/image-20230315175531473.png)]
创建/更新 namespace
创建和授权后,在相关k8s任务选择命名空间时下拉可选,如果k8s集群名字是ds_null_k8s
是测试模式,不会真正操作集群。
数据质量任务是用于检查数据在集成、处理过程中的数据准确性。本版本的数据质量任务包括单表检查、单表自定义SQL检查、多表准确性以及两表值比对。数据质量任务的运行环境为Spark2.4.0,其他版本尚未进行过验证,用户可自行验证。
用户在界面定义任务,用户输入值保存在TaskParam
中 运行任务时,Master
会解析TaskParam
,封装DataQualityTask
所需要的参数下发至Worker。
Worker
运行数据质量任务,数据质量任务在运行结束之后将统计结果写入到指定的存储引擎中,当前数据质量任务结果存储在dolphinscheduler
的t_ds_dq_execute_result
表中 Worker
发送任务结果给Master
。
Master
收到Worker的TaskResponse
之后会判断任务类型是否为DataQualityTask
,如果是的话会根据taskInstanceId
从t_ds_dq_execute_result
中读取相应的结果,然后根据用户配置好的检查方式,操作符和阈值进行结果判断,如果结果为失败的话,会根据用户配置好的的失败策略进行相应的操作,告警或者中断。
配置./worker-server/conf/common.properties,(每台部署DS的服务器都执行如下配置)
编辑vim ./worker-server/conf/common.properties
配置文件,修改如下:
data-quality.jar.name=dolphinscheduler-data-quality-3.1.4.jar
配置./master-server/conf/common.properties,(每台部署DS的服务器都执行如下配置)
编辑vim ./master-server/conf/common.properties
配置文件,修改如下:
resource.storage.type=HDFS
resource.hdfs.root.user=root
resource.hdfs.fs.defaultFS=hdfs://qianfeng01:9000
配置完成后选择停止DS集群,然后重启DS集群。
注意事项
- 添加配置信息:
/conf/common.properties data-quality.jar.name=dolphinscheduler-data-quality-dev-SNAPSHOT.jar
这里的
data-quality.jar.name
请根据实际打包的名称来填写。如果单独打包
data-quality
的话,记得修改包名和data-quality.jar.name
一致。如果是老版本升级使用,运行之前需要先执行
SQL
更新脚本进行数据库初始化。当前
dolphinscheduler-data-quality-dev-SNAPSHOT.jar
是瘦包,不包含任何JDBC
驱动。 如果有JDBC
驱动需要,可以在节点设置
选项参数
处设置--jars
参数, 如:--jars /lib/jars/mysql-connector-java-8.0.16.jar
。当前只测试了
MySQL
、PostgreSQL
和HIVE
数据源,其他数据源暂时未测试过。
Spark
需要配置好读取Hive
元数据,Spark
不是采用JDBC
的方式读取Hive
。
校验公式:[校验方式][操作符][阈值],如果结果为真,则表明数据不符合期望,执行失败策略
校验方式:
操作符:=、>、>=、<、<=、!=
期望值类型
例子
假设实际值为10,操作符为 >, 期望值为9,那么结果 10 -9 > 0 为真,那就意味列为空的行数据已经超过阈值,任务被判定为失败。
检查介绍
表行数校验的目标是检查表的行数是否达到预期的值,如果行数未达标,则会判断任务为失败
任务参数介绍
创建DQ数据校验任务,并保存工作流,如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o3Rcezs9-1683341767435)(https://yadongli-oss.oss-cn-beijing.aliyuncs.com/img/image-20230421183503313.png)]
--conf spark.yarn.maxAppAttempts=1 \
--jars /usr/local/dolphinscheduler-3.1.4/worker-server/libs/mysql-connector-java-8.0.16.jar
上面任务创建好后,保存工作流即可。
上线运行
查看运行状态
查看数据质量模块列表
检查介绍
空值检查的目标是检查出指定列为空的行数,可将为空的行数与总行数或者指定阈值进行比较,如果大于某个阈值则判定为失败
任务参数介绍
创建对应的任务和工作流
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cm4uzZXw-1683341767436)(https://yadongli-oss.oss-cn-beijing.aliyuncs.com/img/image-20230421163828228.png)]
上线运行
不赘诉
查看运行状态
查看质量状态
自定义SQL校验介绍
任务参数解释
创建工作流
上线运行
不赘诉
查看运行状态
查看质量状态
到此为止,DolphinScheduler的所有内容就结束了,期待下一期的更新…