0%

分布式任务调度系统的技术选型

一个调度系统,涉及的功能可按任务执行周期分为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

参考