【本文正在参与 “拥抱开源 — Apache DolphinScheduler 有奖征稿活动】,活动地址

Apache DolphinScheduler 大数据工作流调度系统

  • 一、背景
  • 二、介绍下DolphinScheduler
  • 三、DolphinScheduler一些优势
    • 1、丰富的业务类型
    • 2、可视化的DAG图
    • 3、资源文件的上传管理
    • 4、活跃的社区和用户群
    • 5、开发语言和框架
    • 6、对dokcer和K8S的支持
    • 与其他开源调度系统对比
  • 四、实用过程中遇见的一些问题
    • 1、业务场景适配的一些问题
    • 2、在线业务使用的一些准备
  • 五、基于docker-compose和MySQL搭建DolphinScheduler
    • 1、下载源码包并拉取相应的镜像
    • 2、下载 MySQL 驱动包
    • 3、修改项目的配置文件
    • 4、启动服务
    • 5、登录系统
  • 六、常见问题
    • 如何通过 docker-compose 管理 DolphinScheduler?
    • 如何通过 docker-compose 扩缩容 master 和 worker?

一、背景

在调研DolphinScheduler之前,我们公司其实有用了一些开源的调度系统,像hera(赫拉)、xxl-job,前者是在我们的大数据平台上作为任务调度的平台,当然我们做了一些二次开发的改造,使得它更贴合我们的业务场景,也利于使用,目前还在持续使用;后者定位为业务平台的调度平台,业务本身的一些定时任务统一接入到该平台,统一管理(旧业务还有不少使用Spring @Scheduler或者quartz实现),然而它对大数据领域相关的调度支持比较弱,所以未做考虑。

关于hera调度系统,它是根据前阿里开源调度系统(zeus)进行的二次开发,zeus本身也已经不维护,作者对其进行了重写,从项目的start和fork上看目前国内应用得并不多,最近提交记录也比较少,最近得一次版本也是在去年(2020)10月份的,社区和活跃都相对一般。但是从可用性和易用性方面我个人还是比较推崇的,中小型公司在数据体系不多、任务量较少的情况下完全可以开箱即用。

当然,业内还有其他一些开源的调度系统,如Azkaban、Airflow等,在国内也有一定的应用,本人未亲身体验过,只在网上了解过相关理论知识,这里也不详细说明。

二、介绍下DolphinScheduler

Apache DolphinScheduler(前身是EasyScheduler) 于 17 年成立于易观数科, 19 年 3 月开源,8 月进入 Apache 孵化器,今年4月份,apache官方渠道宣布DolphinScheduler完成毕业成为顶级项目(国内成为apache顶级项目的不多,如阿里的分布式消息中间件RockMQ、Java 服务框架Dubbo、腾讯的分部署对象存储Ozone、分布式数据库中间件shardingsphere、分布式OLAP分析引擎kylin)。

Apache DolphinScheduler是一个分布式去中心化,易扩展的可视化DAG工作流任务调度系统。DolphinScheduler致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用。通过平台降低数据的ETL的开发成本、提升效率。

什么是去中心化?
区块链就是一个很好的去中心化的案例,所谓去中心化,就是把隶属于中心的权力分散,将数据和服务打散,好比是由中央集权转为共产主义制度。这么做有什么好处呢?第一,避免数据垄断的出现,数据垄断往往事用户的隐私信息得不到保障;第二,降低中心异常或安全问题,提升容错能力


MasterServer采用分布式无中心设计理念,MasterServer主要负责 DAG 任务切分、任务提交监控,并同时监听其它MasterServer和WorkerServer的健康状态。 MasterServer服务启动时向Zookeeper注册临时节点,通过监听Zookeeper临时节点变化来进行容错处理。

WorkerServer也采用分布式无中心设计理念,WorkerServer主要负责任务的执行和提供日志服务。 WorkerServer服务启动时向Zookeeper注册临时节点,并维持心跳。

关于WorkerServer负载均衡的一些问题,DolphinScheduler提供了三种算法,加权随机(random默认)、平滑轮询(roundrobin)、线性负载(lowerweight),线性负载均衡是用过节点的CPU、内存的配置和负载情况来实现的,详细配置可参考官方文档

核心特性

其他的一些设计目标和能力:

  • DAG图的方式将Task按照任务的依赖关系关联起来,可实时可视化监控任务的运行状态
  • 支持丰富的任务类型:Shell、MR、Spark、Flink、SQL(mysql、postgresql、hive、sparksql、clickhouse),Python、HTTP、Sub_Process、Procedure等
  • 支持工作流定时调度、依赖调度、手动调度、手动暂停/停止/恢复,同时支持失败重试/告警、从指定节点恢复失败、Kill任务等操作
  • 支持工作流优先级、任务优先级及任务的故障转移及任务超时告警/失败
  • 支持工作流全局参数及节点自定义参数设置
  • 支持资源文件的在线上传/下载,管理等,支持在线文件创建、编辑
  • 支持任务日志在线查看及滚动、在线下载日志等
  • 实现集群HA,通过Zookeeper实现Master集群和Worker集群去中心化
  • 支持对Master/Worker cpu load,memory,cpu在线查看
  • 支持工作流运行历史树形/甘特图展示、支持任务状态统计、流程状态统计
  • 支持补数
  • 支持多租户
  • 支持国际化
    还有更多等待伙伴们探索,参考地址

三、DolphinScheduler一些优势

1、丰富的业务类型

为更好的应对大数据的使用场景,在任务方面支撑更多的数据调度,如:Shell、MR、Spark、Flink、SQL(mysql、postgresql、hive、sparksql、clickhouse),Python、HTTP、Sub_Process、Procedure等

2、可视化的DAG图



3、资源文件的上传管理

支持对各种资源文件的管理,包括创建基本的txt/log/sh/conf/py/java等文件、上传jar包等各种类型文件,可进行编辑、重命名、下载、删除等操作

4、活跃的社区和用户群

DolphinScheduler在会内也获得了大量的用户,据不完全统计,目前已经有 400 多家公司在生产上使用 DolphinScheduler 作为大数据任务调度,高度得到市场的认可。图片整理来源于dolphinscheduler开源社区,更详细的资料或者你们公司也在使用的话可以通过github查看和提交。

5、开发语言和框架

DolphinScheduler的技术栈也是一方面为什么关注它的原因,基本上符合后台开发的一些主流的框架,如果需要进行二次改造的话基本没有门槛,我们看下DolphinScheduler的技术栈:

  • 后端: SpringBoot (2.X,目前是2.1.18)、Quartz(2.3.0)
  • 前端: VUE
  • 编译: Maven(3.3+) ,
  • 元数据存储: Mysql5.5+
  • 分布式无中心化设计: ZooKeeper(3.4.6+)
  • 统一资源管理 : 共享存储[HDFS、S3A、MinIO]

6、对dokcer和K8S的支持

目前已经推出了多种安装方式,包括单机、集群的部署,对与原生的支持,支持Docker部署、Kubernetes 部署、SkyWalking Agent 部署等,做到弹性的伸缩、资源隔离。我们在第五章也会详细介绍如何基于docker-compose和mysql搭建dolphinscheduler

与其他开源调度系统对比

维度\平台 DolphinScheduler Hera Akazkaba AirFlow
背景 前身是EasyScheduler,于 17 年成立于易观数科, 19 年 3 月开源,8 月进入 Apache 孵化器,今年4月成为顶级项目 根据前阿里开源调度系统(zeus)进行的二次开发 Azkaban是由Linkedin开源的一个批量工作流任务调度器。Azkaban定义了一种KV文件格式来建立任务之间的依赖关系,并提供一个易于使用的web用户界面维护和跟踪你的工作流。 airflow是Airbnb开源出托管于托管在Apache基金会的,通过python定义作业
可视化 任务状态、任务类型、重试次数、任务运行机器、可视化变量等关键信息一目了然 任务DAG图展示、支持实时运行的任务,失败任务,成功任务,任务耗时,机器的负载,内存,进程,cpu信息的可视化 部分任务相关信息 有直观的DAG依赖,有良好的UI对任务进行查看
作业配置 shell 、python、 MR、Spark、Flink、SQL、DataX、Sqoop等等 shell、python、SQL、Spark、Hive、MR、Sqoop command、shell、hadoop、java python脚本
过载处理 任务队列+多种任务分配策略+自我保护机制 任务队列+过载保护 任务过多服务器卡顿 任务过多服务器卡顿
监控审计
开发语言 Java Java Java Python
作业告警
是否支持暂停和恢复
是否支持多租户
权限管控
易用性 较好 较好 较好
社区活跃 活跃 活跃
高可用
可扩展性 一般 一般
维护成本
缺陷 hera整体使用还是比较容易方便,但是从目前来看社区太小,支撑未来一些新型的数据调度可能比较局限 集群化中的部署相对繁琐,且可扩展性也不高,功能相对较为单一 性能相对较弱,并发支持得不是很好,对实时性要求较高的话可能无法支撑,通过Python定义作业,如果不了解Python的话门槛相对高一点

引用其倡导的一句标语“工具选得好,下班回家早;调度用的对,半夜安心睡”。

四、实用过程中遇见的一些问题

1、业务场景适配的一些问题

1、Sqoop使用的一些问题,Sqoop是DolphinScheduler在1.3的版本为了提升全流程ETL 工作流的能力上增加的,不过export貌似只能支持全表或者分区表的导出,比较不方便,如果能够直接支持SQL的话就相当方便。
2、Clickhouse To Mysql无法支持,这是我司的一些业务场景,如果像基于Clickhouse计算完的数据想直接写入到一些业务Mysql上的话目前来看还无法支持,官方如果未来不支持的话只能自己手动改造了。

2、在线业务使用的一些准备

1、性能的压力测试,网传在线业务已经能够支撑到10W级别的并发,但是这个跟集群规模配置和业务的复杂程度都是相关的,自己的业务需要经过一定的验证。
2、业务场景的适配,技术、平台的选型更多的是适配业务场景,再牛逼的技术如果没有适合的业务场景可能也一无是处,我们还需要拿更多的案例来验证其适用性。
3、平台使用的易用性,个人来看DolphinScheduler从操作成本上来看相比Hera可能会复杂些,交互场景会多一些步骤,会产生一些学习转换的成本。
4、告警配置的一些改造,邮件告警可能不适合我司,想接入如企业微信需要做一些调整改造,希望未来能够就自动支持。

五、基于docker-compose和MySQL搭建DolphinScheduler

根据官网推荐的方式按照docker-compose配置还是非常方便,未安装docker-compose的请自行安装。下面的安装步骤增加了一步:使用MySQL 替代 PostgreSQL 作为 DolphinScheduler的数据库,并且使数据源中心支持MySQL数据源,因为官方提供的版本因为MySQL许可证的原因并未把MySQL的驱动包放进去,所以需要使用MySQL的话需要自己打包。

1、下载源码包并拉取相应的镜像

到apache官网下载已release的源码,目前稳定的版本是1.3.6

$ tar -zxvf apache-dolphinscheduler-1.3.6-src.tar.gz
$ cd apache-dolphinscheduler-1.3.6-src/docker/docker-swarm
$ docker pull apache/dolphinscheduler:1.3.6
$ docker tag apache/dolphinscheduler:1.3.6 apache/dolphinscheduler:latest

2、下载 MySQL 驱动包

mysql-connector-java-5.1.49.jar (要求 >=5.1.47)创建一个新的 Dockerfile,用于添加 MySQL 的驱动包:

FROM apache/dolphinscheduler:1.3.6
COPY mysql-connector-java-5.1.49.jar /opt/dolphinscheduler/lib

构建一个包含 MySQL 驱动包的新镜像:

docker build -t apache/dolphinscheduler:mysql-driver .

也可以直接拉本人已经制作好的,在个人Docker Hub仓库

3、修改项目的配置文件

修改 docker-compose.yml 文件中的所有 image 字段为 apache/dolphinscheduler:mysql-driver

如果你想在 Docker Swarm 上部署 dolphinscheduler,你需要修改 docker-stack.yml

注释 docker-compose.yml 文件中的 dolphinscheduler-postgresql 块

在 docker-compose.yml 文件中添加 dolphinscheduler-mysql 服务(可选,你可以直接使用一个外部的 MySQL 数据库),详细配置如下:

version: "3.1"services:dolphinscheduler-mysql:image: bitnami/mysql:latestenvironment:TZ: Asia/ShanghaiMYSQL_USERNAME: rootMYSQL_ROOT_PASSWORD: rootMYSQL_DATABASE: dolphinschedulervolumes:- dolphinscheduler-mysql:/bitnami/mysqlrestart: unless-stoppednetworks:- dolphinschedulerdolphinscheduler-zookeeper:image: bitnami/zookeeper:latestenvironment:TZ: Asia/ShanghaiALLOW_ANONYMOUS_LOGIN: "yes"ZOO_4LW_COMMANDS_WHITELIST: srvr,ruok,wchs,consvolumes:- dolphinscheduler-zookeeper:/bitnami/zookeeperrestart: unless-stoppednetworks:- dolphinschedulerdolphinscheduler-api:image: apache/dolphinscheduler:mysql-drivercommand: api-serverports:- 12345:12345environment:TZ: Asia/Shanghaienv_file: config.env.shhealthcheck:test: ["CMD", "/root/checkpoint.sh", "ApiApplicationServer"]interval: 30stimeout: 5sretries: 3depends_on:- dolphinscheduler-mysql- dolphinscheduler-zookeepervolumes:- dolphinscheduler-logs:/opt/dolphinscheduler/logs- dolphinscheduler-shared-local:/opt/soft- dolphinscheduler-resource-local:/dolphinschedulerrestart: unless-stoppednetworks:- dolphinschedulerdolphinscheduler-alert:image: apache/dolphinscheduler:mysql-drivercommand: alert-serverenvironment:TZ: Asia/Shanghaienv_file: config.env.shhealthcheck:test: ["CMD", "/root/checkpoint.sh", "AlertServer"]interval: 30stimeout: 5sretries: 3depends_on:- dolphinscheduler-mysqlvolumes:- dolphinscheduler-logs:/opt/dolphinscheduler/logsrestart: unless-stoppednetworks:- dolphinschedulerdolphinscheduler-master:image: apache/dolphinscheduler:mysql-drivercommand: master-serverenvironment:TZ: Asia/Shanghaienv_file: config.env.shhealthcheck:test: ["CMD", "/root/checkpoint.sh", "MasterServer"]interval: 30stimeout: 5sretries: 3depends_on:- dolphinscheduler-mysql- dolphinscheduler-zookeepervolumes:- dolphinscheduler-logs:/opt/dolphinscheduler/logs- dolphinscheduler-shared-local:/opt/softrestart: unless-stoppednetworks:- dolphinschedulerdolphinscheduler-worker:image: apache/dolphinscheduler:mysql-drivercommand: worker-serverenvironment:TZ: Asia/Shanghaienv_file: config.env.shhealthcheck:test: ["CMD", "/root/checkpoint.sh", "WorkerServer"]interval: 30stimeout: 5sretries: 3depends_on:- dolphinscheduler-mysql- dolphinscheduler-zookeepervolumes:- dolphinscheduler-worker-data:/tmp/dolphinscheduler- dolphinscheduler-logs:/opt/dolphinscheduler/logs- dolphinscheduler-shared-local:/opt/soft- dolphinscheduler-resource-local:/dolphinschedulerrestart: unless-stoppednetworks:- dolphinschedulernetworks:dolphinscheduler:driver: bridgevolumes:dolphinscheduler-mysql:dolphinscheduler-zookeeper:dolphinscheduler-worker-data:dolphinscheduler-logs:dolphinscheduler-shared-local:dolphinscheduler-resource-local:

修改 config.env.sh 文件中的 DATABASE 环境变量指向MySQL

DATABASE_TYPE=mysql
DATABASE_DRIVER=com.mysql.jdbc.Driver
DATABASE_HOST=dolphinscheduler-mysql
DATABASE_PORT=3306
DATABASE_USERNAME=root
DATABASE_PASSWORD=root
DATABASE_DATABASE=dolphinscheduler
DATABASE_PARAMS=useUnicode=true&characterEncoding=UTF-8

如果你已经添加了 dolphinscheduler-mysql 服务,设置 DATABASE_HOST 为 dolphinscheduler-mysql 即可

4、启动服务

到这里,你就可以启动整个dolphinscheduler服务了,执行:

docker-compose up -d

5、登录系统

访问前端页面: 本地地址为 http://127.0.0.1:12345/dolphinscheduler,默认的用户是admin,默认的密码是dolphinscheduler123

我们可以在监控中心看到,这边的DB已经被替换为了MySQL了

六、常见问题

此部分参考dolphinscheduler官方文档,更多的常见问题可以再上面找到解决方案。

如何通过 docker-compose 管理 DolphinScheduler?

启动、重启、停止或列出所有容器:

docker-compose start
docker-compose restart
docker-compose stop
docker-compose ps

停止所有容器并移除所有容器、网络:

docker-compose down

停止所有容器并移除所有容器、网络和存储卷:

docker-compose down -v

如何通过 docker-compose 扩缩容 master 和 worker?

扩缩容 master 至 2 个实例:

docker-compose up -d --scale dolphinscheduler-master=2 dolphinscheduler-master

扩缩容 worker 至 3 个实例:

docker-compose up -d --scale dolphinscheduler-worker=3 dolphinscheduler-worker

参考资料清单:
https://github.com/apache/incubator-dolphinscheduler
https://dolphinscheduler.apache.org/zh-cn/
https://blog.csdn.net/weixin_36836847/article/details/96379318
https://lidong.blog.csdn.net/article/details/108513690
https://zhangboyi.blog.csdn.net/article/details/114017156

欢迎指导,持续更新…

【本文正在参与 “拥抱开源 — Apache DolphinScheduler 有奖征稿活动】,[活动地址]

Apache DolphinScheduler 大数据工作流调度系统相关推荐

  1. 大数据之调度系统-Azkaban

    大数据之调度系统-Azkaban 数据仓库与Python大数据 5天前 以下文章来源于大数据与人工智能 ,作者HappyMint 01常用的调度框架及其对比 常用的调度平台框架有Oozie.Airfl ...

  2. 大数据工作流开源系统之DRAKE

    开发十年,就只剩下这套Java开发体系了 >>>    1工作流开源系统概要 以下是各类数据分析的工作流pipeline管道模型的框架和库包,包含特定科学等业务领域行业或者通用领域, ...

  3. 【2017年第1期】基于外卖物流配送大数据的调度系统

    蒋凡,徐明泉, 崔代锐 百度外卖研发中心 中图分类号:TP399    文献标识码:A doi:10.11959/j.issn.2096-0271.2017013 Scheduling system ...

  4. 大数据 通用 调度系统 的设计和实现

    目标: 调度的业务类型是针对ETL数据抽取任务.个性化推荐的离线任务.每天的报表.每周的统计报表.月级别的统计报表等,小时级的日志清洗任务等 能够按照用户的配置,准时进行调度. 调度的任务主要是一些脚 ...

  5. OPPO大数据离线任务调度系统OFLOW

    1 离线调度系统 在整个大数据体系中,在原始数据被采集之后,需要使用各种逻辑进行整合和计算之后才能输出实际有效的数据,才能最终用于商业目的,实现大数据的价值.在整个处理流程中,无论是抽取.转换.装载( ...

  6. 应用于大数据分析的工作流调度系统

    Apache Airflow airflow是Airbnb开源的一个用python编写的调度工具,是一个可编程.调度和监控的工作流平台.基于有向无环图(DAG),airflow可以定义一组有依赖的任务 ...

  7. 工作流调度系统介绍,常见工作流调度系统对比,azkaban与Oozie对比,Azkaban介绍与特性(来自学习笔记)

    1. 工作流调度器azkaban 1.1 概述 1.1.1为什么需要工作流调度系统 一个完整的数据分析系统通常都是由大量任务单元组成:shell脚本程序,java程序,mapreduce程序.hive ...

  8. 为什么需要工作流调度系统?

    写在前面 本文隶属于专栏<100个问题搞定大数据理论体系>,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和文献引用请见100个问题搞定大数据理 ...

  9. 大数据、云计算系统高级架构师课程学习路线图

    大数据之Linux+大数据开发篇 大数据的前景和意义也就不言而喻了,未来,大数据能够对大量.动态.能持续的数据,通过运用新系统.新 工具.新模型的挖掘,从而获得具有洞察力和新价值的东西.源于互联网的发 ...

最新文章

  1. JavaScript初学者编程题(25)
  2. Real-Time DNA Sequencing from Single Polymerase Molecules
  3. Android studio 另一个程序正在使用此文件,进程无法访问
  4. java科学计数字符串显示
  5. matlab Normally distributed random numbers in two columns
  6. 操作系统之常考面试题
  7. 读取properties
  8. Android风格与主题
  9. linux中python进程,如何检查进程在python中运行(在linux中)?
  10. 计算机考试网站配置参数错误,计算机模拟考试系统_安装计算机考试模拟系统显示“数据库连接错误请联系管理员”是怎么回事...
  11. 本特利振动前置器330180-51-00
  12. 工业机器人pallet指令_工业机器人编程指令详解
  13. 绘画技巧:怎样才能画好拟人化兽人?
  14. 大数据核心技术是什么?
  15. java 句柄无效_c# – 通过java运行.net控制台时“句柄无效”
  16. MongoDB之学习【一】:初识Mongo,路远道长,绵绵不绝
  17. 安卓证书库文件BKS制作
  18. 2020对口高考计算机专业分数线,2020高考分数线(分数线及一分一段表)
  19. S2-052的POC测试
  20. linux制作deepin启动盘制作工具,深度启动盘制作工具(Deepin Boot Maker)下载_深度启动盘制作工具(Deepin Boot Maker)官方下载-太平洋下载中心...

热门文章

  1. 基于sumo和车牌识别数据的城市仿真
  2. MySQL修改root密码的多种方法+给远程登录赋权
  3. 毕业论文及写作其他论文期间常碰到的问题
  4. Linux RedHat7 安装oracle
  5. vs2010与vc6中字符转换的问题
  6. 【网络工程师备考分享】怎么复习,去哪里找真题练习。
  7. 新媒体运营黎想: UGC社区运营技巧!
  8. matlab实现ad转换器,宝宝作业-基于Matlab流水线AD转换器行为级模型建模与仿真
  9. ajax (阿贾克斯)----------- js 向后端索要数据的方式(技术)
  10. matlab出现索引超出数组元素的数目(0)怎么解决