1
、组件介绍:
图
1-
整体系统架构和组件的位置
Yarn
和
Superir scheduler
是为了和
Hadoop DRM
系统一起工作而专门设计的,类似于
Yarn
现有的开源
Fair scheduler
和
Capacity scheduler,Superior Scheduler
遵循着
Yarn Scheduler
的插件接口,与
Yarn RM
组件一起提供资源调度功能,它有两个主要的组件:
1
、
Superior Yarn Scheduler Engine
通用的调度引擎,旨在支持更广泛的场景,包括大数据、云计算和集装箱编配等。这个组件提供通用的资源建模、分配请求建模。它还提供了大量的内置先进的调度策略,包括多租户在多个资源池、基于用户共享,多个维度调度,预定,数据意识和技术意识调度,和
affinity/anti-affinity
调度等。
Superior Scheduling Engine
是
hadoop
的一个独立的模块。它可以通过集成插入不同的
DRM
系统。
2
、
Superior Yarn Scheduler Plugin
Yarn RM
和
superior scheduling engine
模块之间的一座桥梁。它实现了完整的
YARN scheduling plugin
到
YARN RM
的接口。它还使用
Superior Scheduling Engine
接口事件和数据传递给
Superior
并拿回分配决策。
Superior YARN scheduling plugin
利用现有的
YARN Web
服务接口和来自
client
端的请求响应。
Superior
的一些特定特性只能通过
RESTful
接口暴漏出来。比如,队列控制(打开
/
关闭
/
活动
/
激活)
,
或查询等待分配请求的详细信息,包括等待容器总数和原因等。
2
、
HPSE
的内部结构:
图
2-High-Performance Scheduler Engine
(
HPSE
)
图
3-Plugin
和
Engine
的内部结构
Yarn Plugin
:
(1)
、
Yarn Plugin Interface
:全面实施的入口接口,消息都是从这个接口进入
Superior scheduler
的。
(2)
、
Superior Web Service
:为用户提供
RESTful,
用于为用户提供特定特性的接口。
(3)
、
Local Data Store
:本地数据存储,用于保持
Yarn RM
的一些查询具体数据结构的问题,如
AM
尝试的申请行为和节点的拉起。
(4)
、
Engine call back
:调度引擎的例行回复,勇于接受来自调度引擎分配和抢占的调度结果
Superior scheduler Engine:
(1)
、
Engine interface
:
Superior Scheduler Engine
的接口,用于接收来自
Plugin
的信息。
(2)
、
RM
:维护资源池、资源、跟踪总容量和可利用的资源。
(3)
、
Queue Manager
:管理队列层次结构和维护所有分配对象的引用。
(4)
、
Queue Policy Manager
:管理策略树的不同实例。
(5)
、
Allocation Manager
:管理全部分配、资源请求的要求,指定分配的策略等等。
(6)
、
User Manager
:在队列中管理与用户相关的策略。
(7)
、
Scheduler Thread
:继续监听队列要求,保障队列的请求得到响应。
3
、
Superior Scheduler
和
Other Scheduler
工作时的区别:
Open-source Scheduler
基于节点匹配算法(节点心跳更新触发调度找到最高优先级容器请求),由于调度程序没有可用资源的全局视图,因此很难对调度器进行优化,例如无论是否繁忙,开源调度器都需要通过延迟调度来进行数据的局部性集群调度,需要保留资源时也十分困难,因为可能有其他节点有足够的资源为高优先级容器服务时,调度器不知道,寻找节点时的调度方法为“最先满足”。
Superior Scheduler
使用一个资源请求调度中心(调度器和调度线程),检视所有的任务请求和资源情况后,优先处理高优先级的请求,根据请求的属性找到匹配的资源,大大提高了调度的效率,拥有单独的线程处理调度事件,减少心跳频率,降低心跳风暴发生的可能,基于集合的算法快读到达最好位置。寻找节点的方法是寻找所有的节点和考虑“最合适的”。
图
4-
资源分配的方法比较
通过图
4
可以看到,开源调度器工作时,
RM
通过心跳获取资源信息,扫描等待工作的队列后,优先匹配最先满足资源条件的工作,这会导致资源的浪费。(个人理解:如工作需要
2G
内存,该节点资源有
8G
内存,但是判断时发现
2G
的任务可以在节点内跑,故直接分配。)
Superior
调度器工作时,
RM
通过心跳将所有调度器节点状态存放在映射中,然后专用调度线程检查所有等待工作的队列,根据各个工作需要的资源量去映射中寻找最匹配的资源节点,将其分配过去,非常节约资源和时间。
4
、
Scheduler Thread
专用调度线程:
开源的
Yarn
调度器默认情况下使用基于心跳的调度,基本上
Yarn
的
NodeManager
会周期性的发送心跳信息到
Yarn
的
ResourceManager
,他们生成
NODE_UPDATA
事件到
Yarn
的调度器,这些事件主要包括调度程序需要处理容器的完成任务状态,处理完毕后,开源的调度器开始协调调度在同一个线程里的节点,由于这里只有一个线程来操作所有节点的更新和应用程序的提交事件,当线程花费时间在调度程序上时,它无法同时处理过程节点更新事件,这使得这些事件在大型的集群环境下堆积起来,为了解决这些堆积的问题,有一个典型的解决办法是减缓心跳发送的间隔时间和控制心跳的请求量。这种设计可能会牺牲集群的利用率存在潜在的缺点。由于
Container
完成事件的同时无法通知
Yarn
调度器,可以人为的延迟调度的过程以分配新的
Container
去使用资源。
1
、从节点更新事件处理分离出调度程序,使事件处理执行的更快。专用的调度线程去处理周期性的调度
2
、设计细粒度锁定和复制“热点”数据区域去提高所有数据更新和调度程序的并行度
3
、高性能的调度程序算法在去减少极端条件下的搜索空间
以上是自己对Superior Scheduler的一点点学习心得,如有错误欢迎大家指正,谢谢