暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

智能化调度系统在企业大数据中的实践

数匠笔谈 2021-04-16
869

更多精彩内容请关注我们

1、前言


随着业务的发展,企业规模的持续扩大,数据的不断累积,对于大数据平台来说,每天承载着成千上万的ETL任务调度。尤其是随着大数据应用的不断深入,需要解决任务数量增长快、任务多样化、任务关系复杂、任务执行效率低及任务失败不可控等问题。
像大部分的大数据项目经理一样,我每天早晨起床的第一件事,就是查看当日系统调度完成情况,系统是否稳定?任务是否有延迟?任务是否有报错?它关系到下游各依赖系统的正常运行和部分业务的正常开展。
怎么样让大量的ETL任务准确的完成调度而不出现问题,甚至在任务调度执行中出现错误的情况下,任务能够完成自我恢复甚至执行错误告警与完整的日志查询呢?此时就涉及到我们这里要分享的智能化调度系统。
我们的调度系统就是针对一项可拆分的工作(每天2万张作业的数据更新),在尽可能满足依赖关系、资源情况、交付时间等约束条件的前提下,安排各任务使用资源、优先级的先后顺序等,获得成本最优化的一项工作。用一句话来描述就是怎么能更高效的使用资源。

2、传统调度系统的挑战


曾有人总结:“ETL是BI (商业智能)的基础,调度是ETL的灵魂”。其实,这个不难理解,用现实生活的例子来理解它。ETL,就是我们去目的地购买各种相关材料,材料的好坏直接影响我们所做饭菜的质量与味道,倘若没有这个保证,那就巧妇难为无米之炊了,所以说它是基础。而调度,则就是我们做饭的流程,好的厨师各道工序先后有章,这样即能保证速度,同时也能保证味道。为了得到完美的味道,我们设置了制作工序。然而,事情并没有那么简单。

   

传统数据仓库的调度系统,均是基于DAG思想设计的复杂时序逻辑,就如上面所示。如果一个企业级调度的数量级达到万级,那么事先就固定的执行逻辑就会成为资源浪费的主要原因,往往因为调度设计不合理或者某张表、某个任务的异常,导致不相干的任务产生大量堆积与等待,如何实现一个动态的、自优化的调度管理?
我们提出了最优调度问题
1、调度系统作为一个复杂的有向无环图系
2、大数据算力平台同一时间能够执行的SQL任务并发度有限
3、每个任务占用的时间长期看来趋于稳定
4、如何调整任务使得所有任务执行时等待时间之和最小?

3、基于智能化算法的云图调度系统


为便于理解,我们将智能调度问题类比为一个装箱问题:

1、箱子和箱子之间有先后关系

2、货车的宽度有限

3、每个箱子有基本的长宽高

4、如何装箱,使得该货车装的箱子体积最多(箱子之间孔隙之和最小)?

调度智能化的目标,是采用根据统计学算法调整任务参数,更快的完成任务,更高的资源利用率,因此我们设计了基于智能化算法的调度系统-云图调度。
调度系统的产生,主要是解决三个问题:任务编排、任务执行和任务监控。不同的问题对应系统中不同的功能模块,为了解决这三个问题,我们设计了调度器、执行器和监控体系。
3.1 调度器

任务编排主要依靠调度系统的调度器。编排的顺序影响到同一时间到达任务的执行顺序,蝴蝶效应在这方面体现的淋漓尽致,一个关键的任务延后执行,造成的结果必然是与其相关联的任务无法按时完成。为避免此类问题发生,我们开始了调度器的探索。调度器主要包含调度方式、调度算法和任务优先级功能。

3.1.1 调度方式

调度方式分为两种,一种是静态调度;另一种是动态调度。静态调度是在进程开始执行之前,就确定好进程的调度顺序,并在之后的执行中不再随环境的变化而改变;动态调度则是在调度环境和任务存在不可预测扰动情况下所进行的调度,他会随环境变化调整调度顺序。与静态调度相比,动态调度能够针对生产现场的实际情况产生更具可操作性的决策方案;

实际生产中的大量问题是随机发生的。如源系统数据晚点、任务报错、集群硬件损坏等随机事件,使得静态调度执行效果不佳,这就需要在执行过程中重新安排调度顺序。动态调度方式就成为云图调度系统的必然选择,为此我们设计了可完全动态调整的调度参数,即理论上可实现每次跑批任务优先级均可以有所不同。

3.1.2 调度算法

因为集群资源的有限性,必须按照一定的原则选择任务来占用资源。更高的资源利用率、更高的吞吐量、更快的响应时间是调度算法存在的价值。常用的调度算法如下:

  • 先到先服务调度算法 

    a、非抢占式调度

    b、按照任务提交的先后顺序分配计算资源

    c、有利于CPU繁忙型任务,不利于I/O繁忙型任务

  • 短任务优先调度算法

    a、抢占式调度/非抢占式调度都适用

    b、该类调度算法有效降低作业的平均等待时间,提高系统吞吐量

    c、未考虑作业的紧迫程度,因而不能保证紧迫性任务的及时处理、对执行时间长的作业不利

  • 高优先权优先调度算法

    a、抢占式调度/非抢占式调度都适用

    b、两种类型:静态优先权:创建任务时确定,整个运行期间保持不变;动态优先权:创建任务时赋予的优先权可随任务的推进或其等待时间的增加而改变

我们对调度优化算法进行了大规模的模拟测试,最终确定采用LL-SCH算法。
3.1.3  LL-SCH算法思想 

高优先权优先调度方式的确认,为我们带来了更大的挑战,那就是怎么设置每个任务的优先级才能让执行时间最短。算法核心考虑了三大输入变量:每个任务平均执行时长、系统同一时刻能承受的最大计算量、关键路径依赖关系,算法中每个参数均需要在模拟与生产环境中不断测试与验证来确定其稳定值。在确认链路中每个任务的加工时长后,根据关键路径执行时长来推算单个与累加任务的权重,根据系统算力情况动态调整优先级常量,经过反复的递归运算,最终我们得到了可以复现的稳定优化模型。

3.2 执行器

首先来看执行引擎的架构,如下图所示

装载过程:依赖源系统的贴源层任务,会根据源系统翻盘时间进行数据抽取,转换、加载到贴源层表中,为下游任务使用提供基础数据。
扫描过程:通过扫描程序不断对集群中的各系统的任务进行扫描,当发现任务达到可执行状态(依赖任务全部完成)时,会立即提交到等待队列。
等待过程:任务进入等待队列后,根据事先确定的任务优先级进行重新排序,并根据跑批队列现状提交任务,优先级越高的任务执行顺序越靠前。
执行过程:执行队列的任务会在集群中完成任务的逻辑加工并添加跑批完成标识,若达到某个任务的执行条件则会改变该任务的执行状态,并加入装载队列。
3.3 监控体系

云图系统有一套完整的监控报警体系,包括针对执行出错的任务以及校验未通过的任务等,设置RPA自动电话外呼、短信、邮件、原心等不同的告警方式。同时,在监控体系中设计有优化指标,包括依赖关系合理性、链路执行时间、链路等待时间、整体归因分析等,实现了日常数据运维的自动化。

3.4 功能架构搭建

明确系统功能矩阵,打造依赖管理>调度器>任务分发>调度方式>执行器>日志智能分析>优化依赖管理的自循环体系。

4、业务成效


云图调度经过一年的迭代研发和实际运行,各项参数已经经过数十次自迭代,目前已经较好地支撑了中原银行各个数据团队各类数据处理任务的日常运行和维护,每天在系统上运行的各类数据处理任务达两万个,日处理数据量达TB级。
根据2020年以来的监测与分析,云图调度的成立有两方面突出效果。一是从采集到交付各阶段数据运行问题的发生比例显著降低,调度系统稳定性明显提高。二是通过调度系统全流程的监控体系,可快速定位问题,决策层、管理层、执行层对调度任务执行情况有直观的掌握,更利于加快推进问题的解决。随着调度问题的持续改进,数据的稳定性、时效性都稳步提升,大大增加了业务使用数据的“可信度”。

   数匠笔谈

更多精彩

扫码关注


文章转载自数匠笔谈,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论