DolphinScheduler海豚调度在Kubernetes中部署实践

1,402 阅读6分钟

DolphinScheduler

简介

Apache DolphinScheduler 海豚调度器是一个分布式易扩展的可视化DAG工作流任务调度开源系统。DolphinScheduler 以 DAG(有向无环图,Directed Acyclic Graph,DAG)流式方式组装任务,可以及时监控任务的执行状态,支持重试、指定节点恢复失败、暂停、恢复、终止任务等操作。

名词解释

DAG: 全称 Directed Acyclic Graph,简称 DAG。工作流中的 Task 任务以有向无环图的形式组装起来,从入度为零的节点进行拓扑遍历,直到无后继节点为止。举例如下图:

glossary.png

流程定义:通过拖拽任务节点并建立任务节点的关联所形成的可视化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 默认的用户和密码分别为 admindolphinscheduler123

$ 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', '')

创建一个测试项目

一、先在页面上创建租户

二、创建一个项目

三、创建一个工作流

image-20230813201308573.png

四、保存工作流,选择刚刚创建的租户

五、上线工作流

六、运行项目,在工作流实例中可以看到执行结果

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检查流程定义或检查所有的子流程定义是否在线