首页 / 新闻

07.

07

2017

混合负载下的资源调度神器--Inceptor Scheduler

技术博客

多租户场景下实现Inceptor中的作业调度是复杂的,不仅要考虑到任务自身的优先级和资源占用情况,而且要结合不同用户|组|角色的权限以及资源配额限制,做细粒度的调度管理。通常会遇到以下几项问题:

1. 资源被大批处理任务占用,导致小的报表任务一直无法被调度。

2. 某个用户持续提交任务,导致系统资源被过度占用,无法执行其他用户的任务。

3. 以往以Stage为调度粒度的方式不能充分利用空闲CPU资源,需要细化粒度。

为解决以上问题,我们在Inceptor 5.0中优化了原有的资源调度器Inceptor Scheduler,可以解决混合负载下的资源调度问题,提供更好的SLA。

 

传统Scheduler的调度算法


让我们先回顾一下TDH 4.x系列中Inceptor Scheduler的大致工作流程。当一个SQL的执行计划Action被触发后,SparkContext被创建,接着实例化DAGScheduler,DAGScheduler负责根据RDD依赖链划分Stage任务阶段,随后把Stage以TaskSet的形式提交给TaskScheduler。TaskScheduler负责维护所有TaskSet,并根据设置的调度模式,对各个TaskSet进行调度。TaskScheduler会为每个TaskSet创建一个TaskSetManager对象,用于管理TaskSet的生命周期,以及TaskSet内部Task的调度。该过程中的资源调度以TaskSet或者Task为粒度,会话对其不可见,也就是说它无法在多租户的场景下,根据用户权限和优先级的不同去分配资源,因此限制了作业调度在企业级生产中的灵活性。

 

新Scheduler的创新一:更精细的调度模式


Inceptor Scheduler共支持三种调度模式:FIFO、FAIR、FURION。这三种模式的区别在于调度逻辑的差别。

FIFO:先进先出是最简单的模式,它根据所有提交的任务按照顺序逐一执行,调度对象是TaskSet。

FAIR:FAIR提供了队列(或资源池)的概念,不同队列具有不同权重。FAIR的调度对象是TaskSet,TaskSet可以提交至不同队列。队列之间的调度采用fair策略,队列内部可以采用fifo或fair策略。

FURION:FURION是开源Spark所不支持的调度模式。它采用树形结构构建队列关系,调度指标有CPU资源数量和比值、队列权重、运行任务数。每个队列都是树形结构中的一个节点,根据节点中的父子和兄弟关系在调度指标上的关系决定调度顺序。FURION调度对象是Task。

FURION模式和FAIR模式的对比

1. FURION和FAIR模式在实现方式上存在共性:

首先它们都是完全公平策略的一种实现;

其次都是采用加权的排序调度算法。

2. 不同之处在于:

FURION中的队列关系采用数据结构构建,而FAIR中的队列关系是平行的;

其次FURION是对Task粒度进行调度,而FAIR的调度粒度是Task。

3. 总体上,Furion Scheduler比FAIR Scheduler能提供更好地调度策略,资源管理的粒度,对权重和用户调度策略具有更好的感知能力。

 

新Scheduler的创新二:图形化的ACL和SLA配置


Inceptor Scheduler的配置可以通过配置文件或者在Guardian上实现。Guardian配置的方法更直观简单,更推荐普通用户使用,因此本文仅介绍Guardian上的配置方式。

成功安装Guardian插件后,打开Guardian界面点击“权限”->“INCEPTOR”,选择待配置的Inceptor服务。

Inceptor Scheduler在该配置模块中所涉及的配置内容包括“队列权限”和“计算配额”两项。

队列权限

队列权限的设置中,管理员可以对用户|组|角色设置GLOBAL(全局)权限,以及对某一个队列的权限。队列权限分为三种:SUBMIT、ADMIN、ACCESS。

1. SUBMIT:代表用户|组|角色对当前队列是否具有提交作业的权限。

2. ADMIN:代表用户|组|角色是否具有把对队列的任意操作权限赋予其他用户的权限。

3. ACCESS:表示用户|组|角色是否具有访问此Inceptor服务的权限,只能在全局配置中设置。

计算配额

点击计算配额项,进入计算配额管理页面。管理员可以在该界面上设置队列相关参数。

由于FURION涵盖了FAIR和FIFO的调度功能,调度方式更有效,所以目前Guardian上只按照FURION模式提供参数配置。各个队列按照树形结构显示,队列名称右侧提供了队列各项配置属性,其中包括队列的权重、预留CPU核数、预留CPU百分比、最大CPU核数、最大CPU百分比以及调度策略。

Guardian上还提供配置单个队列、单个连接和单个用户可以向Inceptor提交的最大SQL数,可以在“默认配置”和“用户设置”两栏中配置。在“用户设置”栏中点击“添加配额”添加用户计算配额。

不在用户设置中的用户将采用默认配置。

 

Inceptor Scheduler的作用效果演示


下面的视频对以下几个场景,演示了在Inceptor Scheduler的控制下可以达到的作业调度效果:

1. 普通用户之间的任务监控相互隔离,在作业状态监控页面上只能看到自己提交的任务。而Admin可以看到所有任务。

2. 在Guardian上配置队列权限和计算配额,并且及时生效。

3. 优先级高的任务先被执行。

4. 非共享的资源约束-资源预留功能。设置两个队列:etl1权重高但保留资源占比低;etl2权重低但保留资源占比高。然后观察执行速度。

5. 可共享的资源约束-最大资源配额。设置两个队列:etl1权重高但是被限制了最大资源配额;etc2权重低但是没有最大资源配额限制。然后观察执行速度。

Inceptor Scheduler在各个方面有效的维护着调度机制和策略,保证资源的分配因用户的不同而存在差异。

 

总结


Inceptor Scheduler对于基于用户和语句的作业调度,使得Inceptor可以更加适应多租户场景的需要。作业调度不再仅从TaskSet或者Task的粒度去考虑,而是综合了租户中的权限、优先级、资源配额等多方面的考虑,实现更完善合理的资源调度。另外用户间的任务隔离使信息更安全,由于用户只能浏览具有权限的任务状态,任务监控页面所展示的内容与用户关联性更强更清晰。

对此篇文章如有任何问题,欢迎以邮件形式联系我们:bigdataopenlab@transwarp.io