Apache DolphinScheduler——开源大数据调度器神器
Apache DolphinScheduler(海豚调度),国人之光,是许多国人雷锋开源在Apache的顶级项目,主要功能就是负责任务的调度处理,Apache DolphinScheduler是一个分布式去中心化,易扩展的可视化DAG工作流任务调度系统。致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用,架构如图,大概看一下
架构分布图说明:
分布式 :就是可以这个组件不同的部分可以分布在不同的机器上,整体的协调工作完成任务调度;(为啥要分布式而不装在一台,因为一头牛拉一大堆物资可能会累死,除了培养更加强壮的牛以外,还可以让多头牛去拉);
去中心化:DolphinScheduler有多台master(负责发号施令,布置任务,接受成果),假设有m1,m2,m3……,也有多台worker(负责真正干活的小弟),假设有w1,w2,w3……,而这些机器都注册在zookeeper,每次任务A来的时候,都同时需要m和w,但是根据你配置的不同任务A将分到不同的m和w上,而不是单纯在一个单点上运行,提高容错性,当然如果你玩单机模式,则不存在这个概念;
易扩展:既然master,worker可以有多个,那可不可有更多,所以DolphinScheduler是支持扩容的,反之,实践中发现太败家了,需要回收一些机器,也是可以支持缩容的;
可视化DAG工作流任务调度:就是除了提供查看日志来查看任务和工作流的运行情况,还有个有序无环图可查看任务和工作流的运行情况;
处理流程中错综复杂的依赖关系:现在有要跑的项目A,B;项目A有工作流a1(内有任务一s1,任务二s2),a2(内有任务一s3,任务二s4),a3(内有任务一s5,任务二s6);项目B里面有工作流b1(内有任务一s7,任务二s8),b2(内有任务一s9,任务二s10);一般的任务调度器,都能保证一个工作流内的任务如s1,s2是有序往下运行的,当然也可并行;但是有些调度器就实现不了工作流a1和a2以及a3之间有依赖关系了,比如某些场景下必须工作流b1先跑完,才可以跑a1,a2;那更甚至的必须先跑完整个项目B才能跑 项目A就更不支持了,即项目之间有壁垒,这些都是比价差劲的,需要用户自己想办法去实现,但是DolphinScheduler这些缺陷都填了,即以上的这些复杂依赖关系,不论是工作流之间,项目之间都支持;
架构图
DolphinScheduler支持多种部署模式,包括单机模式(Standalone)
、伪集群模式(Pseudo-Cluster)
、集群模式(Cluster)
等。
1)单机模式
单机模式下,所有的服务都集中于一个StandaloneServer进程中,并且在其中内置了注册中心Zookeeper和数据库H2,只需要配置JDK环境,就可以一键启动DolphinScheduler。
一般用于快速体验功能。
2)伪集群模式
伪集群模式是在单台机器上部署DolphinScheduler各项服务,该模式下master、worker、api server、logger server等服务都只在同一台机器上。Zookeeper和数据库需单独安装并进行相应配置。
适用于公司中正式上线前的测试集群。
3 )集群模式
集群模式与伪集群模式的区别就是在多台机器上部署DolohinScheduler各项服务,并且可以配置多个Master及多个Worker。
DolphinScheduler概述
DolphinScheduler是一个分布式、易扩展的可视化DAG工作流调度平台,致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用。
DolphinScheduler组件
DolphinScheduler主要包含以下几个部分:
1)MasterServer
:
采用分布式无中心设计理念。
MasterServer主要负责DAG(工作流)任务切分、任务提交(提交给WorkerServer并分配任务给WorkerServer)、任务监控,并同时监听其它的MasterServer和WorkerServer的健康状态(为了做高可用,容错机制。假如有一个WorkerServer挂掉了,要把它的工作分配给别的WorkerServer;假如有一个MasterServer挂掉了,那么这个MasterServer负责的工作就要交给别的MasterServer去负责,哪个MasterServer抢到它就负责)。
2)WorkerServer
:
也采用分布式无中心设计理念。
WorkerServer主要负责任务的执行和提供日志服务。
3)Zookeeeper
:
系统中的MasterServer和WorkerServer节点都通过Zookeeper来进行集群管理和容错,zookeeper负责协调整个集群。
4)Alert
:
Alert服务,提供告警相关服务(电话、邮件等等)。
5)API接口
:
API接口层,主要负责处理前端UI的请求,比如前端要看有哪些任务再执行,执行的进度如何,都要通过API接口调用。
6)UI
:
UI是整个系统的前端页面,提供系统的各种可视化操作界面。
接下来就来进入实战演练呀,先是单机模式,
如果是非单例模式请看另外一篇文章:
https://blog.csdn.net/weimeilayer/article/details/141052040
首先安装部署DolphinScheduler需要docker 19x以上
1.安装docker-ce
安装依赖的软件包
yum install -y yum-utils device-mapper-persistent-data lvm2
添加Docker的阿里云yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新软件包索引
yum makecache fast
查看docker版本,这里选择25.0.5
yum list docker-ce --showduplicates |sort –r
安装docker-ce
yum install -y docker-ce-25.0.5
2.启动Docker服务
systemctl start docker #启动Docker
systemctl enable docker.service #设置开机自启
查看docker版本
docker --version
开始拉取dolphinscheduler
镜像
docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/dolphinscheduler-standalone-server:3.2.0
启动服务
使用 standalone-server 镜像
docker run --name dolphinscheduler-standalone-server \
-p 32000:12345 \
-p 25333:25333 \
-v /data/dolphinscheduler:/opt/dolphinscheduler \
-d registry.cn-hangzhou.aliyuncs.com/qiluo-images/dolphinscheduler-standalone-server:3.2.0
添加了重启策略 --restart unless-stopped,它确保容器自动重启,除非它被明确停止。这提高了服务器重新启动或容器崩溃时的可靠性。
docker run --name dolphinscheduler-standalone-server \
-p 32000:12345 \
-p 25333:25333 \
-v /data/dolphinscheduler:/opt/dolphinscheduler \
-e DOLPHINSCHEDULER_OPTS="-Xms512m -Xmx1024m" \
--restart unless-stopped \
-d registry.cn-hangzhou.aliyuncs.com/qiluo-images/dolphinscheduler-standalone-server:3.2.0
docker run -d --name dolphinscheduler-standalone-server \
-p 32000:12345 \
-p 25333:25333 \
-e TZ="Asia/Shanghai" \
-e SPRING_JACKSON_TIME_ZONE="Asia/Shanghai" \
-v /data/dolphinscheduler:/dolphinscheduler \
registry.cn-hangzhou.aliyuncs.com/qiluo-images/dolphinscheduler-standalone-server:3.2.0
swagger
地址:http://ip:端口/dolphinscheduler/swagger-ui/index.html
登录DolphinScheduler
界面
启动服务后,在浏览器中输入http://ip:端口/dolphinscheduler/ui
访问DolphinScheduler
.
默认的用户名:admin
密码:dolphinscheduler123
登录成功后进入到DolphinScheduler的管理界面。
然后是准备驱动,上传到 /data/dolphinscheduler/
目录下
kingbase8-8.6.0.jar
mysql-connector-j-8.4.0.jar
mysql-connector-java-5.1.48.jar
ojdbc6-11.2.0.3.jar
postgresql-42.7.3.jar
DmJdbcDriver18-8.1.2.79.jar
然后进入/data/dolphinscheduler/
目录
cd /data/dolphinscheduler
然后复制驱动到容器中
docker cp kingbase8-8.6.0.jar dolphinscheduler-standalone-server:/opt/dolphinscheduler/libs/alert-server/
docker cp mysql-connector-j-8.4.0.jar dolphinscheduler-standalone-server:/opt/dolphinscheduler/libs/alert-server/
docker cp mysql-connector-java-5.1.48.jar dolphinscheduler-standalone-server:/opt/dolphinscheduler/libs/alert-server/
docker cp ojdbc6-11.2.0.3.jar dolphinscheduler-standalone-server:/opt/dolphinscheduler/libs/alert-server/
docker cp postgresql-42.7.3.jar dolphinscheduler-standalone-server:/opt/dolphinscheduler/libs/alert-server/
docker cp DmJdbcDriver18-8.1.2.79.jar dolphinscheduler-standalone-server:/opt/dolphinscheduler/libs/alert-server/
docker cp kingbase8-8.6.0.jar dolphinscheduler-standalone-server:/opt/dolphinscheduler/libs/api-server/
docker cp mysql-connector-j-8.4.0.jar dolphinscheduler-standalone-server:/opt/dolphinscheduler/libs/api-server/
docker cp mysql-connector-java-5.1.48.jar dolphinscheduler-standalone-server:/opt/dolphinscheduler/libs/api-server/
docker cp ojdbc6-11.2.0.3.jar dolphinscheduler-standalone-server:/opt/dolphinscheduler/libs/api-server/
docker cp postgresql-42.7.3.jar dolphinscheduler-standalone-server:/opt/dolphinscheduler/libs/api-server/
docker cp DmJdbcDriver18-8.1.2.79.jar dolphinscheduler-standalone-server:/opt/dolphinscheduler/libs/api-server/
docker cp kingbase8-8.6.0.jar dolphinscheduler-standalone-server:/opt/dolphinscheduler/libs/master-server/
docker cp mysql-connector-j-8.4.0.jar dolphinscheduler-standalone-server:/opt/dolphinscheduler/libs/master-server/
docker cp mysql-connector-java-5.1.48.jar dolphinscheduler-standalone-server:/opt/dolphinscheduler/libs/master-server/
docker cp ojdbc6-11.2.0.3.jar dolphinscheduler-standalone-server:/opt/dolphinscheduler/libs/master-server/
docker cp postgresql-42.7.3.jar dolphinscheduler-standalone-server:/opt/dolphinscheduler/libs/master-server/
docker cp DmJdbcDriver18-8.1.2.79.jar dolphinscheduler-standalone-server:/opt/dolphinscheduler/libs/master-server/
docker cp kingbase8-8.6.0.jar dolphinscheduler-standalone-server:/opt/dolphinscheduler/libs/worker-server/
docker cp mysql-connector-j-8.4.0.jar dolphinscheduler-standalone-server:/opt/dolphinscheduler/libs/worker-server/
docker cp mysql-connector-java-5.1.48.jar dolphinscheduler-standalone-server:/opt/dolphinscheduler/libs/worker-server/
docker cp ojdbc6-11.2.0.3.jar dolphinscheduler-standalone-server:/opt/dolphinscheduler/libs/worker-server/
docker cp postgresql-42.7.3.jar dolphinscheduler-standalone-server:/opt/dolphinscheduler/libs/worker-server/
docker cp DmJdbcDriver18-8.1.2.79.jar dolphinscheduler-standalone-server:/opt/dolphinscheduler/libs/worker-server/
# 暂时可以不需要
docker cp kingbase8-8.6.0.jar dolphinscheduler-standalone-server:/opt/dolphinscheduler/libs/standalone-server/
docker cp mysql-connector-j-8.4.0.jar dolphinscheduler-standalone-server:/opt/dolphinscheduler/libs/standalone-server/
docker cp mysql-connector-java-5.1.48.jar dolphinscheduler-standalone-server:/opt/dolphinscheduler/libs/standalone-server/
docker cp ojdbc6-11.2.0.3.jar dolphinscheduler-standalone-server:/opt/dolphinscheduler/libs/standalone-server/
docker cp postgresql-42.7.3.jar dolphinscheduler-standalone-server:/opt/dolphinscheduler/libs/standalone-server/
docker cp DmJdbcDriver18-8.1.2.79.jar dolphinscheduler-standalone-server:/opt/dolphinscheduler/libs/standalone-server/
然后有需要使用到datax的组件需要python3
环境
进入容器直接执行命令
apt-get update
apt-get install -y python3 python3-pip
apt-get install -y python python-pip
python3 --version
pip3 --version
然后有需要使用到datax的组件需要python2
环境
进入容器直接执行命令
apt-get update
apt-get install -y python python-pip
python --version
pip --version
此时此刻就完成部署了,就可以测试连接了
测试Doris 连接成功了
如何使用Kubernetes上部署dolphinscheduler-standalone-server
创建vi dolphinscheduler-deployment.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: dolphinscheduler-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/data/dolphinscheduler"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: dolphinscheduler-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: dolphinscheduler-standalone-server
labels:
app: dolphinscheduler
spec:
replicas: 1
selector:
matchLabels:
app: dolphinscheduler
template:
metadata:
labels:
app: dolphinscheduler
spec:
containers:
- name: dolphinscheduler-standalone-server
image: registry.cn-hangzhou.aliyuncs.com/qiluo-images/dolphinscheduler-standalone-server:3.2.0
ports:
- containerPort: 12345
name: api-port
- containerPort: 25333
name: master-port
volumeMounts:
- name: dolphinscheduler-storage
mountPath: /opt/dolphinscheduler
volumes:
- name: dolphinscheduler-storage
persistentVolumeClaim:
claimName: dolphinscheduler-pvc
---
apiVersion: v1
kind: Service
metadata:
name: dolphinscheduler-service
labels:
app: dolphinscheduler
spec:
selector:
app: dolphinscheduler
ports:
- name: api-port
protocol: TCP
port: 12345
targetPort: 12345
nodePort: 32000
- name: master-port
protocol: TCP
port: 25333
targetPort: 25333
nodePort: 25333
type: NodePort
然后部署
kubectl apply -f dolphinscheduler-deployment.yaml
第三种在Kubernetes上部署Apache DolphinScheduler
1.建议为DolphinScheduler创建一个单独的命名空间(如果还没创建):
kubectl create namespace dolphinscheduler
2.准备ZooKeeper
DolphinScheduler依赖ZooKeeper作为协调服务。可以使用已有的ZooKeeper服务,也可以在Kubernetes上部署一个新的实例。以下是一个简单的ZooKeeper StatefulSet部署:
vi zookeeper-deployment.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: zookeeper
namespace: dolphinscheduler
spec:
serviceName: "zookeeper"
replicas: 3
selector:
matchLabels:
app: zookeeper
template:
metadata:
labels:
app: zookeeper
spec:
containers:
- name: zookeeper
image: registry.cn-hangzhou.aliyuncs.com/qiluo-images/zookeeper:latest
ports:
- containerPort: 2181
volumeMounts:
- name: data
mountPath: /data
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
3.准备PostgreSQL,但是MySQL也是可以的
DolphinScheduler依赖PostgreSQL数据库存储任务信息。可以使用已有的PostgreSQL服务,也可以部署一个新的:
vi postgresql-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres
namespace: dolphinscheduler
spec:
replicas: 1
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: registry.cn-hangzhou.aliyuncs.com/qiluo-images/postgres:latest
ports:
- containerPort: 5432
env:
- name: POSTGRES_USER
value: "dolphinscheduler"
- name: POSTGRES_PASSWORD
value: "Yo5WYypu0mCCheOU"
- name: POSTGRES_DB
value: "dolphinscheduler"
4.部署DolphinScheduler
创建DolphinScheduler的Deployment和Service资源。你需要配置环境变量来连接ZooKeeper和PostgreSQL:
vi dolphinscheduler-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: dolphinscheduler
namespace: dolphinscheduler
spec:
replicas: 1
selector:
matchLabels:
app: dolphinscheduler
template:
metadata:
labels:
app: dolphinscheduler
spec:
containers:
- name: dolphinscheduler
image: registry.cn-hangzhou.aliyuncs.com/qiluo-images/dolphinscheduler:latest
ports:
- containerPort: 12345
- containerPort: 56789
env:
- name: DATABASE_HOST
value: "plsql.dolphinscheduler.svc.cluster.local"
- name: DATABASE_PORT
value: "5432"
- name: DATABASE_DATABASE
value: "dolphinscheduler"
- name: DATABASE_USERNAME
value: "dolphinscheduler"
- name: DATABASE_PASSWORD
value: "Yo5WYypu0mCCheOU"
- name: ZOOKEEPER_QUORUM
value: "zookeeper.dolphinscheduler.svc.cluster.local:2181"
- 配置Ingress或NodePort
根据你的集群设置,可能需要配置Ingress或NodePort以暴露DolphinScheduler的Web UI:
vi dolphinscheduler-service.yaml
apiVersion: v1
kind: Service
metadata:
name: dolphinscheduler-service
namespace: dolphinscheduler
spec:
type: NodePort
ports:
- port: 12345
targetPort: 12345
nodePort: 30001
- port: 56789
targetPort: 56789
nodePort: 30002
selector:
app: dolphinscheduler
最后执行
kubectl apply -f zookeeper-deployment.yaml
kubectl apply -f postgresql-deployment.yaml
kubectl apply -f dolphinscheduler-deployment.yaml
kubectl apply -f dolphinscheduler-service.yaml