业务架构-数据-开源调度系统
背景
Crontab任务调度
最开始用crontab调度,但是时间长了出现问题
大量的crontab任务需要管理
任务没有按时执行,各种原因失败,需要重试
多服务器环境下,crontab分散在很多集群上,光是查看log就很花时间
于是,出现了一些管理crontab任务的调度系统
CronHub
https://github.com/sharpstill/CronHub
http://wenku.baidu.com/link?url=_Tc9q2duvOE7ZJkFeltWNo4mTiG3AR2qZx77RQ_iBNOGO9Si9GQdhIUmIbazRtYSrlZZx_kzeL90lLLWv7xT2ApDS2RbZ98WHPf7c9OGj2i
暴风马晨开源时间调度系统,web界面管理不同机器上的crontab任务
但是,任务之间有依赖关系Crontab无法满足,方式有:zk通知、脚本DAG图,但是修改很复杂;
后来出现了基于工作流的调度系统;
CronWeb
https://github.com/fisherinnovation/CronWeb
工作流调度系统
数据量增大,任务中充斥着大量的ETL任务,依赖:时间、外部时间、数据等
任务会失败:重试、报警
主要功能:
- DAG定义 (DAG的定义方式:表达式,脚本定义,通过WEB UI定义;还需要支持子DAG)
- 执行节点 (节点类型:unix cmd,shell,python,mapreduce, logging etc…)
- 节点控制(ignore, retry, suspend, run now, test mode)
- Metrics (需要对比一段时间内任务的运行时间)
- Monitor (失败策略,报警通知功能)
- CLI & Web UI (查询 workflow 执行情况,以及简单的控制)
Hadoop工作流引擎
Oozie
(Hadoop生态圈)
工作流中有多个Action,如:Map/Reduce job,pig job
所有的Action以有向无环图DAG模式部署运行
特点:
- 有MapReduce的Action,定义一个mapreduce任务很方便,而且可以直接通过job id关联到hadoop history页面
- Oozie任务的资源文件都必须存放在HDFS上
- Action也方便扩展,比如添加自定义的任务类型或者报警方式
缺点:XML配置DAG依赖
功能多,支持:分支,ok,failed节点,但是复杂,维护成本高;
HUE
Oozie很难用,所以HUE提供了一个Oozie的编辑器;
可以通过仪表板提交和监控Workflow、Coordinator和Bundle
AZKABAN
(Hadoop生态圈)
Linkedin开源批量工作流任务调度器,定义了一种KV文件格式来建立任务之间的依赖关系,提供一个易于使用的web用户界面维护和跟踪你的工作流;
DAG定义方式比Oozie简单很多,properties文件里通过dependencies指定任务的上游依赖,Azkaban支持可插拔的扩展插件,如支持pig/hive;
所有的任务资源文件都需要打成一个zip包上传,资源文件较大时不太方便,也可以上传到HDFS,运行的时候才copy到本地;
ZEUS
Alibaba开源
支持任务的整个生命周期
- Hadoop MapReduce任务的调试运行
- Hive任务的调试运行
- Shell任务的运行
- Hive元数据的可视化查询与数据预览
- Hadoop任务的自动调度
- 完整的文档管理
 针对Hadoop集群任务定制,通用性不强
基于Python的工作流引擎
dagobah
https://github.com/thieman/dagobah
基于DAG任务调度系统,可以使用Cron语法调度周期性任务,任务之间可以定义依赖关系;
支持重试某个失败的任务,任务结束或失败的后发送汇总邮件,跟踪任务的输出log,持久化到不同的后端。Dagobash是一个相当轻量级的调度系统。
dagobah可以通过Web UI通过拖拉的方式操作dag,也支持直接通过代码定义:
from dagobah import Dagobah
from dagobah.backend.base import BaseBackend
my_dagobah = Dagobah(BaseBackend())
my_dagobah.add_job('My Job')
my_job = my_dagobah.get_job('My Job')
my_job.add_task('python required_task.py', 'Required Task')
my_job.add_task('python dependent_task.py', 'Dependent Task')
my_job.add_dependency('Required Task', 'Dependent Task')
my_job.schedule('0 10 * * *')
Luigi
Spotify开源,关注流程复杂的长时间运行的批次任务
例如Hadoop任务,推送数据,或者从数据库拉数据的任务,机器学习算法任务等
能处理依赖关系,工作流关系,可视化等,内置对hadoop的支持;
Pinball
Pinterest开源,扩展性较好;
master-worker模式,master节点负责管理任务调度,worker节点是无状态的。
Pinball无缝集成了Hadoop/Hive/Spark等。
提供了:自动重试,单任务邮件报警,运行时替换,任务优先级,过载策略等功能
Airflow
Airbnb开源DAG任务调度系统,用于管理,调度和监控工作流;
与Luigi,Pinball很像。后端是基于Flask,Celery,RabbitMQ/Redis
Airflow的功能很多,对于工作流可以支持Cron语法调度,失败重试策略,各种任务依赖调度策略等
一大亮点就是backfill功能,可以指定开始时间,将一个时间范围的任务重跑,Airflow还提供了丰富的命令行CLI和UI供操作。
通过Celery实现分布式调度,架构设计清晰易于扩展;
http://blog.csdn.net/jet47/article/details/51996871
https://github.com/common-workflow-language/common-workflow-language/wiki/Existing-Workflow-systems
https://github.com/pditommaso/awesome-pipeline
 
                    
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号