DolphinScheduler
简介
Apache DolphinScheduler 海豚调度器是一个分布式易扩展的可视化DAG工作流任务调度开源系统。DolphinScheduler 以 DAG(有向无环图,Directed Acyclic Graph,DAG)流式方式组装任务,可以及时监控任务的执行状态,支持重试、指定节点恢复失败、暂停、恢复、终止任务等操作。
名词解释
DAG: 全称 Directed Acyclic Graph,简称 DAG。工作流中的 Task 任务以有向无环图的形式组装起来,从入度为零的节点进行拓扑遍历,直到无后继节点为止。举例如下图:
流程定义:通过拖拽任务节点并建立任务节点的关联所形成的可视化DAG
流程实例:流程实例是流程定义的实例化,可以通过手动启动或定时调度生成。每运行一次流程定义,产生一个流程实例
任务实例:任务实例是流程定义中任务节点的实例化,标识着某个具体的任务
任务类型:目前支持有 SHELL、SQL、SUB_PROCESS(子流程)、PROCEDURE、MR、SPARK、PYTHON、DEPENDENT(依赖),同时计划支持动态插件扩展,注意:其中 SUB_PROCESS类型的任务需要关联另外一个流程定义,被关联的流程定义是可以单独启动执行的
调度方式:系统支持基于 cron 表达式的定时调度和手动调度。命令类型支持:启动工作流、从当前节点开始执行、恢复被容错的工作流、恢复暂停流程、从失败节点开始执行、补数、定时、重跑、暂停、停止、恢复等待线程。 其中 恢复被容错的工作流 和 恢复等待线程 两种命令类型是由调度内部控制使用,外部无法调用
定时调度:系统采用 quartz 分布式调度器,并同时支持cron表达式可视化的生成
依赖:系统不单单支持 DAG 简单的前驱和后继节点之间的依赖,同时还提供任务依赖节点,支持流程间的自定义任务依赖
优先级 :支持流程实例和任务实例的优先级,如果流程实例和任务实例的优先级不设置,则默认是先进先出
邮件告警:支持 SQL任务 查询结果邮件发送,流程实例运行结果邮件告警及容错告警通知
失败策略:对于并行运行的任务,如果有任务失败,提供两种失败策略处理方式,继续是指不管并行运行任务的状态,直到流程失败结束。结束是指一旦发现失败任务,则同时Kill掉正在运行的并行任务,流程失败结束
补数:补历史数据,支持区间并行和串行两种补数方式,其日期选择方式包括日期范围和日期枚举两种
src模块介绍
- dolphinscheduler-master master模块,提供工作流管理和编排服务。
- dolphinscheduler-worker worker模块,提供任务执行管理服务。
- dolphinscheduler-alert 告警模块,提供 AlertServer 服务。
- dolphinscheduler-api web应用模块,提供 ApiServer 服务。
- dolphinscheduler-common 通用的常量枚举、工具类、数据结构或者基类
- dolphinscheduler-dao 提供数据库访问等操作。
- dolphinscheduler-remote 基于 netty 的客户端、服务端
- dolphinscheduler-service service模块,包含Quartz、Zookeeper、日志客户端访问服务,便于server模块和api模块调用
- dolphinscheduler-ui 前端模块
执行策略
并行:如果对于同一个工作流定义,同时有多个工作流实例,则并行执行工作流实例。串行等待:如果对于同一个工作流定义,同时有多个工作流实例,则串行执行工作流实例。串行抛弃:如果对于同一个工作流定义,同时有多个工作流实例,则抛弃后生成的工作流实例并杀掉正在跑的实例。串行优先:如果对于同一个工作流定义,同时有多个工作流实例,则按照优先级串行执行工作流实例。
部署
使用docker部署一个测试环境,DolphinScheduler 默认的用户和密码分别为 admin 和 dolphinscheduler123
$ DOLPHINSCHEDULER_VERSION=3.1.8
$ docker run --name dolphinscheduler-standalone-server -p 12345:12345 -p 25333:25333 \
-v /usr/local/bin/python3.11:/opt/soft/python \
-d apache/dolphinscheduler-standalone-server:"${DOLPHINSCHEDULER_VERSION}"
在kubernetes上部署生产集群
需要提前解决以下环境:
- ingress
- 支持ReadWriteMany的storageClass
- zookeeper:chat中集成
- 数据库:postgresql/mysql chat中集成
- hadoop:可选,如果需要使用到资源上传功能,MapReduce任务提交则需要配置。hadoop.apache.org/docs/stable…
- hive:可选,hive任务提交需要安装
- spark:可选,Spark任务提交需要安装
$ wget --no-check-certificate https://dlcdn.apache.org/dolphinscheduler/3.1.8/apache-dolphinscheduler-3.1.8-src.tar.gz
$ tar -zxvf apache-dolphinscheduler-3.1.8-src.tar.gz
$ cd apache-dolphinscheduler-3.1.8-src/deploy/kubernetes/dolphinscheduler
$ helm repo add bitnami https://charts.bitnami.com/bitnami
$ helm dependency update .
# 如果上传到自己的仓库,imagePullSecrets也可以加一下
$ vi values.yaml
image:
registry: "dolphinscheduler.docker.scarf.sh/apache"
tag: "3.1.8"
pullPolicy: "IfNotPresent"
pullSecret: ""
conf:
common:
resource.storage.type: NONE
# 设计存储的添加storageClass
persistence:
enabled: true
size: "20Gi"
storageClass: "nfs-client-storage"
ingress:
enabled: True
host: "xxx.org"
path: "/dolphinscheduler" # 这个路径不能修改,否则ingress得加rewrite
annotations: {}
tls:
enabled: false
secretName: "dolphinscheduler-tls"
$ helm install dolphinscheduler . -n dolphinscheduler
$ kubectl get po -n dolphinscheduler
NAME READY STATUS RESTARTS AGE
dolphinscheduler-alert-5c99979f65-vcqww 1/1 Running 0 113s
dolphinscheduler-api-85bd4cf797-6txm7 1/1 Running 0 113s
dolphinscheduler-db-init-job-59kpr 0/1 Completed 0 113s
dolphinscheduler-master-0 1/1 Running 0 113s
dolphinscheduler-master-1 1/1 Running 2 (81s ago) 113s
dolphinscheduler-master-2 1/1 Running 1 (95s ago) 113s
dolphinscheduler-postgresql-0 1/1 Running 0 113s
dolphinscheduler-worker-0 1/1 Running 0 113s
dolphinscheduler-worker-1 1/1 Running 2 (81s ago) 113s
dolphinscheduler-worker-2 1/1 Running 1 (94s ago) 113s
dolphinscheduler-zookeeper-0 1/1 Running 0 113s
$ kubectl get svc -n dolphinscheduler
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dolphinscheduler-alert ClusterIP 10.140.236.93 <none> 50052/TCP,50053/TCP 2m27s
dolphinscheduler-api ClusterIP 10.140.3.89 <none> 12345/TCP,25333/TCP 2m27s
dolphinscheduler-master-headless ClusterIP None <none> 5678/TCP 2m27s
dolphinscheduler-postgresql ClusterIP 10.140.79.36 <none> 5432/TCP 2m27s
dolphinscheduler-postgresql-headless ClusterIP None <none> 5432/TCP 2m27s
dolphinscheduler-worker-headless ClusterIP None <none> 1234/TCP 2m27s
dolphinscheduler-zookeeper ClusterIP 10.140.157.10 <none> 2181/TCP,2888/TCP,3888/TCP 2m27s
dolphinscheduler-zookeeper-headless ClusterIP None <none> 2181/TCP,2888/TCP,3888/TCP 2m27s
$ kubectl get ing -n dolphinscheduler # 实际发现无法访问
NAME CLASS HOSTS ADDRESS PORTS AGE
dolphinscheduler <none> xxx.org 80 2m34s
$ kubectl get ingressclasses.networking.k8s.io # 查看ingressclasses
NAME CONTROLLER PARAMETERS AGE
nginx k8s.io/ingress-nginx <none> 160d
$ kubectl edit ing -n dolphinscheduler dolphinscheduler # 添加ingressClassName
spec:
ingressClassName: nginx
$ kubectl -n dolphinscheduler get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
dolphinscheduler-fs-file Bound pvc-63e3223b-50fe-4039-8c5d-11bec3a7ee73 20Gi RWX nfs-client 20m
# 如果使用了nfs而且pod无法启动,需要在每个节点上安装一下nfs客户端
$ kubectl describe po -n dolphinscheduler dolphinscheduler-worker-0
Output: mount: /var/lib/kubelet/pods/1a429cfe-3ae2-40ff-8eb4-3c7b6800b5a7/volumes/kubernetes.io~nfs/pvc-63e3223b-50fe-4039-8c5d-11bec3a7ee73: bad option; for several filesystems (e.g. nfs, cifs) you might need a /sbin/mount.<type> helper program.
$ apt install nfs-common
# 现在就可以访问了,admin:dolphinscheduler123
http://xxx.org/dolphinscheduler
添加python环境
# 把想要安装的包写入requirements.txt
$ cat requirements.txt
requests
$ vi Dockerfile
FROM dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-worker:3.1.8
COPY requirements.txt /tmp
RUN apt-get update && \
apt-get install -y --no-install-recommends python-pip && \
pip2 install --no-cache-dir -r /tmp/requirements.txt && \
rm -rf /var/lib/apt/lists/*
RUN ln -s /usr/bin/python2.7 /usr/bin/python
$ docker build -t xxx/dolphinscheduler-worker-python:3.1.8 .
$ docker push xxx/dolphinscheduler-worker-python:3.1.8
修改chart或者直接修改worker的镜像
$ kubectl edit sts -n hyop-ds dolphinscheduler-worker
psql数据库
$ psql -h 127.0.0.1 -p 5432 -U "root" -d dolphinscheduler
Password for user root: root
# 查看所有表
\dt
# 查看表结构
\d t_ds_process_instance
# 查看状态
dolphinscheduler=> SELECT state, COUNT(*) FROM t_ds_process_instance GROUP BY state;
state | count
-------+--------
5 | 1
6 | 241
7 | 350850
14 | 133440
(4 rows)
# 清理串行等待数据,14 就是SERIAL_WAIT,删除掉。
DELETE FROM t_ds_process_instance WHERE state = 14;
# 批量清理任务历史数据
DELETE FROM t_ds_process_instance WHERE name like '更新缓存%';
DELETE FROM t_ds_task_instance where name = 'updateCache';
参数
需要注意的是,这边参数不仅需要转义
()也不行!
参数要传递${参数},传递过去就是参数值,传递${参数}就是传递参数值,例如定义了args=XX
-
shell中使用参数:
echo ${args} -
python中使用参数:
print("${args}")
参数传递
- shell:
echo ${setValue(key=value)} - python:
print('${setValue(key=%s)}' % repr(value)),在多行数据时候需要添加repr()不转义,也可以使用SHOW = SHOW.replace('\n', '\\n').replace('\t', '\\t').replace('(', '(').replace(')', ')').replace('\r', '')
创建一个测试项目
一、先在页面上创建租户
二、创建一个项目
三、创建一个工作流
四、保存工作流,选择刚刚创建的租户
五、上线工作流
六、运行项目,在工作流实例中可以看到执行结果
API
一般都是通过页面来创建项目、流程等,但是与第三方系统集成就需要通过调用 API 来管理项目、流程。
文档地址:${url}/dolphinscheduler/swagger-ui/index.html?language=zh_CN&lang=cn
| 接口 | 描述 |
|---|---|
| /start-process-instance | 执行流程实例 |
| /batch-start-process-instance | 批量执行流程实例 |
| /execute | 操作流程实例,如:暂停, 停止, 重跑, 从暂停恢复,从停止恢复 |
| /batch-execute | 批量操作流程实例 |
| /start-check | 检查流程定义或检查所有的子流程定义是否在线 |