cover_image

汽车之家统一调度平台设计及实践

胡广胜 之家技术
2020年04月16日 08:00

图片

总篇第91篇 2020年第15篇



1、之家分布式任务调度背景

   任务调度系统在大数据平台当中是一个核心的基础设施,由于数据处理流程常常具有很长的依赖链条,因此依赖单机的crontab等单纯依赖时间调度的方式,往往存在很大的弊端,如依赖不清晰,出错难以查找等问题。

 

2、之家分布式调度的优势

1、可视化的任务管理,依赖管理,运行历史以及日志查看。

2、在线更新和执行任务,实时更新,实时生效。

3、多种调度方式:支持手动,定时,依赖,定时+依赖。

4、分布式部署,保证系统高可用,可伸缩,支持失效转移提高了容错性。

5、任务,运行记录,日志持久化,避免了宕机和数据丢失带来的隐患,同时有完善的任务失败重做机制和详细的任务跟踪及告警策略。

6、支持跨周期依赖。

7、集成了Datax,一个Datax数据同步任务作为调度的一个Job来进行调度,提供web页面,并支持在线动态配置,实时修改实时生效。

 

 

3、之家调度系统介绍

3.1、分布式任务调度技术选型

Spring-boot 社区活跃的开发框架。用于快速开发,快速迭代。

Mybatis:一款优秀的持久层框架,支持定制化 SQL,存储过程以及高级映射。用于简化持久层开发。

Hbase:Hadoop文件系统之上的分布式面向列的数据库,调度中主要是日志,脚本和数据订阅结果存储

Zookeeper:久经考验的注册中心。用来解决调度中心高可用,分布式一致性,事件触发等问题。

Netty:一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端,用来解决调度Master与Worker通讯问题。

Protobuf:序列化框架,主要用在Master与Worker通讯数据进行序列化

Apache Curator:封装较好的zk客户端

Quartz:开源调度框架,调度中使用其作为定时任务的调度

DataX:阿里巴巴开源,任意异构数据系统离线数据交换的工具

 

3.2、设计思想

    用户通过WebUI的任务操作事件通过zk触发,事件统一注册到event节点下,集群master监听event节点来处理相应的任务触发事件,达到任务实时更新(任务信息,调度信息,依赖信息),和任务执行操作。调度集群基于ZK来实现高可用,master启动时会将自身ip和端口注册到/group,worker启动时获取并建立长连接,使用netty作为通讯框架,数据交互格式统一使用protobuf。任务统一由master来进行分发,master内存中维护执行机器的分组,任务可选择执行组来指定机器。worker会定时以心跳的方式将任务运行情况机器内存cpu上报到master,master依赖这些信息来均衡分配任务。考虑到异常情况,master会检查worker连接情况,连接断开时master会kill问题机器上的任务,重新分配其他可用执行机器。

   

3.3、调度的几个核心概念

1、任务(job):基本执行单元,执行器与master通过消息来下发执行任务。

2、事件(event):可理解为操作类型,例如任务的curd,启用禁用,定时触发,依赖触发,成功事件,失败时间。

3、批次(batch):由若干个顺序执行的任务组成,多个任务之间存在依赖关系。

4、监听器(listener):每个类型类型的event都有一个对应的监听器处理。

5、任务调度中心(scheduler):根据每个的作业的执行周期进行调度。

6、任务执行器(Executer):任务执行器,接收消息并执行任务操作。

 

3.4、Master-Slave架构

我们采用在大数据领域常见的Master-Slave架构

Master: 负责处理event,任务调度,批次调度,任务分发。

Worker:接收调度请求并执行任务

任务注册中心(Zookeeper):协调任务和执行器

HBase:日志存储

图片


3.5、模块划分

主要有3个大的模块,调度前端管理,Master 和 Wokrer,下面分别介绍3个模块的职责

1)WEBUI主要负责任务,脚本,监控等的维护

    任务管理:包含任务CRUD,启动/停用,任务依赖关系管理,手动执行,查看运行历史,查看运行日志等等一系列任务任务操作

    脚本管理:任务实际执行的脚本维护

    SLA:批量任务的报警管理

    执行节点(executor)管理:动态上线线,调整机器任务数,切换机器分组

    批次管理:先解释下批次:由若干个顺序执行的任务组成,多个任务之间存在依赖关系。而这里是针对整个批次的处理,支持DGA图查看运行状态,支持批量kill

2)Master为调度的核心模块,复制主要的工作

    定时调度:定时任务的调度

    任务依赖:监听成功事件,记录任务上游完成情况,基于条件启动任务

    事件监听:监听Zookeeper上事件节点,触发任务执行。

    任务分发:判断执行机器状态,cpu内存,任务运行数据,均衡的分配任务到执行机。

    失效恢复:当执行机器异常,kill任务,重新分发到可用机器。

    扩容伸缩:支持水平的动态添加执行机器

3)Worker 为调度实际执行任务的模块

    任务执行:支持Shell,Python,Zip,Java等形似。同时支持Datax任务

    心跳上报:定时上报心跳,包含机器运行状态,任务数据,cpu,内存

    参数处理:对用户配置的任务相应参数进行处理,封装新的脚本,生成启动命令

    DataX:对用户配置的交换数据源信息进行组装生成 datax标准的json格式和启动命令

4)HBase日志和脚本存储

5)Zookeeper注册中心:

    事件发布:基于Zookeeper监听机制,进行任务的发布。

    注册中心:调度Master和Worker都以Zookeeper作为注册中心;数据以节点及节点内容的形式注册,master定时将全部执行机器情况注册到Zookeeper上!

    元数据存储:注册中心不仅仅提供注册服务,并且存储每个执行器的信息,以及事件信息。

 

图片


4、集成IDE

看下图,调度系统对外提供4个接口:

    1、任务执行:调度将IDE请求包装为一个临时任务,提交到集群执行并返回任务唯一ID

    2、任务取消:基于任务ID取消任务,调度前端将注册取消事件到ZK触发集群取消正常运行的任务进程

    3、日志查询:基于ID,调度前端将获取任务执行的机器直接读取机器运行日志

    3、数据导入:多IDE提交的数据进行包装,生成一个数据导入任务,发布到集群客户机器执行

总的来说,之家IDE目前是基于调度系统实现,例如常用的操作 执行,取消,日志查询,数据导入等均是以HTTP接口的形式通过调度来实现的,每一次执行会在调度系统生成一个临时任务,和IDE以ID进行关联。

 

 

图片


 

5、总结

作为汽车之家自研的统一调度系统,调度系统定义了大数据计算和处理的逻辑与规则,对所有任务的执行顺序进行编排管理,实现了任务的有序和高效执行。同时,调度系统可便捷的实现任务的执行、重跑、终止等操作,能方便的查看执行日志,及时监控管理任务执行情况。

 

6、后续计划

1、Master目前为单机模式,存在瓶颈,需要优化

2、Master和Worker为长连接,存在断开的风险,可考虑改使用RPC框架或者Http来替换。

 

 

图片



继续滑动看下一个
之家技术
向上滑动看下一个