一个调度系统,涉及的功能可按任务执行周期分为3部分:
- 执行前:
- 任务定义,如任务关系可以用DAG定义;
- 任务调度,如按cron调度;
- 任务分发,如通过mq分发任务;
- 执行中:
- 任务执行资源隔离:不同作业可在不同的机器上执行;
- 任务执行并发控制:同一类型的作业可控制并发数;
- 任务执行进度查询:可查询作业中每个任务的执行情况;
- 任务后:
- 任务执行异常通知:任务执行异常有邮件/消息通知机制;
- 任务执行情况统计:可以分析历史执行情况,评估SLA;
典型的工作处理流程
工作流程通常由一系列的任务组成,并由调度器或事件触发,其通常包含5个步骤:
- 下载任务数据;
- 分发任务数据到处理节点;
- 监控处理进度直到任务结束;
- 获取任务处理结果并生成任务处理报告;
- 发送任务处理报告;
选型要求
- 作业定义:支持DAG,DAG流程支持模板复用;
- 任务定义:至少支持bash,jdbc,hive,hdfs;
- 任务调度:支持CRON,支持事件触发,区间补数据(串行/并行);
- 任务隔离:作业可隔离执行环境,如采用kubernetes,每个task实例启动一个pod,可采用不同的镜像;
- 任务执行:支持任务并行,支持重新执行;
- 任务回溯:支持补数据(backfill/catchup):正向/逆向;
- 数据血缘:task节点可以手动配置/自动生成至少table级别的数据血缘,在任务执行成功后推送到元数据服务;
- 异常处理:资源不足时支持任务堆积,节点异常时支持故障转移,机器重启时支持任务恢复,任务超时/异常时可自动重试;
- 监控告警:监控任务状态,集成邮件/sentry/wechat告警;
- 安全权限:支持多租户,DAG流程图可按租户隔离,支持LDAP身份验证,Kerberos安全通信;
- 定制开发:有完善的API接口(REST/Java)
- 高可用:任务调度节点高可用(避免单点故障),任务执行节点高可用(避免任务过多时产生阻塞);
选型比较
- hadoop调度:oozie、azkaban
- 通用调度:airflow、xxl-job、dolphin scheduler
- 数据处理+调度:nifi