在工作流任务调度的选择上,开源版本的 Apache 、基于 Apache DolphinScheduler 研发的商业版本 ,以及 都是不错的选择。本文在相同硬件测试背景下对这三个调度平台的性能进行了对比。结果显示,WhaleScheduler 的表现让人惊喜。
测试环境采用 8 台 AWS 8C 16G 服务器作为 Apache DolphinScheduler 和 Airflow 的部署服务器,配置如下:同理 Airflow 的 Scheduler 与 Worker 均部署在这 8 台服务器上,运行 Apache DolphinScheduler 时关闭 Airflow 服务,保证相互不影响。数据库采用 AWS 的 RDS 作为存储,配置如下:
整个压测过程中会使用到 2 个工具:DolphinScheduler 基准压测工具、Airflow 基准压测工具。- batch_inser_command.sh 用于批量往 t_ds_command 插入数据
- clear_history_process_instance.sh 用于清理相关数据
batch_inser_command 参数说明:- process_definition_code=123 // 工作流
- process_definition_version=1 // 版本
- batch_size=10 // 1 次插入 sql 数量
- 启动 100 个工作流 1,写入数据库 t_d_command,等待 Master 去拉取
1. 创建工作流 Shell , 脚本内容:echo 123,工作流实例 process_definition_code 是:7546934660384。2. 登录 Linux 控制台,使用 batch_inser_command.sh 往数据库插入 100 条数据,插入内容是 process_definition_code 是 7546934660384 工作流实例。
sh batch_inser_command.sh 7546934660384 1 10 10
通过 Python 脚本创建 DAG 文件,并放到 Airflow dags 目录,让 scheduler dag-processor 将 DAG 文件解析并持久化到数据库,最后启动 Airflow Scheduler 启动调度。1. 通过环境变量初始化数据库信息:其中 admin 是 MySQL 用户名,admin123 是 MySQL 密码,10.0.0.1 是 MySQL 地址,3306 是 MySQL 端口,test 是对应 DB 库,命令如下:export Airflow__DATABASE__SQL_ALCHEMY_CONN=mysql+mysqldb://admin:admin123@10.0.0.1:3306/test
2. 通过运行 airperf.py 生产数据:python3 airperf.py generate- Airflow dag-processor 将 dags 文件夹的文件解析并持久化到数据库
- Airflow Worker, Airflow Scheduler 开始调度和测试
- python airperf.py analyse --part throughput 或者 python airperf.py analyse --part latency 分析任务并发和延时
调度任务进行吞吐时,我们这里等任务全部入库后,直接统计数据内的字段来衡量当前系统的吞吐情况。Apache DolphinScheduler 和 Airflow 采用相同的指标来对比,DolphinScheduler 指标明细说明见附 1,Airflow 指标明细说明见附 2。DolphinScheduler 对比 Airflow 单机测评
在单机情况下分别验证 Apache DolphinScheduler 与 Apache Airflow 实际处理简单的 Shell 的并发值。DolphinScheduler 对比 Airflow 单机调度 Shell 脚本由于我们是测试调度能力,这里选择的测试简单 Shell 脚本,脚本内容为: echo 123 我们分别验证了以下几个场景,验证 t_ds_commad 表并发是 300、400、500、700、800 的情况下 task_avg_count_start_time_per_min(任务平均启动时间/分钟)、Max num of started tasks per sec(启动总任务数最高值/秒)的值;同理,在关闭 Apache DolphinScheduler 服务后,在同 1 台单机上验证 Airflow 在以上情况下 task_avg_count_start_time_per_min 、Max num of started tasks per sec 的值。
注: 这里我们将服务运行日志输出调成 ERROR 级别。- 可以看出单机情况下 Apache Dolphinscheduler 和 Airflow 的 CPU 都达到接近 99%;
- Airflow 在不同 command 并发情况下,每分钟任务并发数(task_avg_count_start_time_per_min) 维持在 1001~1080 左右;
- Apache DolphinScheduler 的 task_avg_count_start_time_per_min 维持在 2120~2420 左右, 是 Airflow 的 2+ 倍。
DolphinScheduler 单机调度能力测评(任务空跑模式)
本次我们也对 Apache DolphinScheduler 的调度拉起任务能力进行了测评,结果如下:DolphinScheduler 对比 Airflow 多机测评
同时,我们也测试了 Apache DolphinScheduler 与 Airflow 在多机情况下 task_avg_count_start_time_per_min(任务平均启动时间/分钟)的表现,结果详情如下:- Airflow 在 4 Scheduler + 7 Worker 下,每分钟任务并发数(task_avg_count_start_time_per_min)可达到 4380;
- Apache DolphinScheduler 仅在 2 Master + 5 Worker 时,每分钟任务并发数(task_avg_count_start_time_per_min) 可达到 6600。
与开源版本的 Apache DolphinScheduler 相比,商业版本 WhaleScheduler 对租户管理、任务日志收集、任务执行线程池进行较大规模的改造与优化,所以性能上面也有很大的提升,详情如下:
多机环境下,Airflow(4 Scheduler + 7 Worker)、DolphinScheduler(2 Master + 5 Worker)、WhaleScheduler(2 Master + 6 Worker) 的每分钟并发数如下:通过以上一些系列实验比对,在 8C 16G 硬件作为服务器配置、IOPS 9000 RDS 数据库环境条件下:- 单机环境下,Apache DolphinScheduler 每分钟调度简单 Shell 任务并发是 Airflow 的 2+ 倍。
- 单机环境下,Apache DolphinScheduler 每分钟调度能力(任务空跑模式) 任务并发可达到 164460。
- 多机环境下,WhaleScheduler 在 2 Master + 6 Worker 时,每分钟调度任务并发最高可到 67320。
- 多机环境下,WhaleScheduler 是 Apache DolphinScheduler 每分钟调度任务并发的 10 倍左右。
- 多机环境下,WhaleScheduler 是 Apache Airflow 每分钟调度任务并发的 15 倍左右。
本次测试为了确保量化数据库本身吞吐性能,我们对 AWS RDS 数据库(IOPS 9000) 也进行了数据库性能基准测试。 使用的是业界常用的工具:Sysbench, 这是一个开源的、模块化的、跨平台的多线程性能测试工具,这里使用它来量化数据库吞吐性能。yum install sysbenchapt-get install sysbench
sysbench --mysql-host=ds-test-mysql.cwkplpl0hwlq.ap-southeast-1.rds.amazonaws.com --mysql-user=admin --mysql-password=adminadmin --threads=80 --time=600 --events=1000000 --mysql-db=sysbench_test /usr/share/sysbench/oltp_insert.lua prepare
d=adminadmin --threads=80 --time=600 --events=1000000 --mysql-db=sysbench_test /usr/share/sysbench/oltp_insert.lua run
sysbench --mysql-host=ds-test-mysql.cwkplpl0hwlq.ap-southeast-1.rds.amazonaws.com --mysql-user=admin --mysql-password=adminadmin --threads=80 --time=600 --events=1000000 --mysql-db=sysbench_test /usr/share/sysbench/oltp_insert.lua cleanup
在优化数据库入库刷新频率参数 innodb_flush_log_at_trx_commit=0 的前提下,在 Sysbench 的 oltp_insert 模式下插入 100 万的 events,这时每秒可达到 32125 个事务。