大规模集群任务调度

随着分布式计算集群规模的不断扩张,任务调度系统的稳定性成为了整个集群稳定的关键因素。随着容器技术的快速兴起,基于容器的计算平台被大量应用,任务调度的规模及频率快速上升,这对任务调度系统提出了更为严苛的挑战。常见的调度系统往往兼顾了准确度却牺牲了性能,容器调度的复杂性使得在准确和效率之间找到平衡点很难,尤其是在交互式调度的场景下,可取的解决方案更是捉襟见肘。本篇文章就以此为背景,介绍大规模调度场景下分布式任务调度的难点、解决策略及现有的一些方案。

任务调度框架的设计目标

计算任务通常分为两个大的类别,即以守护进程形式运行的长任务和以批处理形式运行的短任务,前者资源的使用率变化幅度小,而后者资源使用率变化大。本篇我们讨论的主要是针对计算密集型的场景,即以批处理形式运行的数据处理任务。

调度系统的核心目标: 快速准确地为任务匹配合适的计算资源。但快速(Low Placement latency)和准确(High Quality Placement
)这两个目标会产生矛盾,即必须在二者间权衡。尤其是在交互式调度场景下,只追求准确度而忽视效率会使得调度失去意义。

调度系统的本质是为计算任务匹配合适的资源,使其能够稳定高效地运行,而影响应用运行的因素非常多,比如CPU、内存、网络、端口等等一系列因素都会影响应用运行的表现。于此同时,整个计算集群的资源使用情况是动态变化的,大量的应用被创建、销毁和迁移,调度决策的过程如果不够快,那么实际运行时面对的资源情况可能与决策时千差万别。

Firmament - 大规模集群任务调度

计算任务的调度不仅仅要考虑资源本身的状况,而且还要结合任务本身的优先级来考虑抢占式调度的情景。比如系统出现异常,临时增加诊断性任务,就必须以高于其他任务的优先级来运行。有资源抢占就涉及到任务驱逐、重调度等情况,这里面会涉及驱逐相关的算法策略、调度流程的复用等。

目前的主流任务调度框架

从目前常用的任务调度框架来看,Apache Mesos是面向数据中心资源管理的典型代表。Hadoop YARN调度器是面向计算任务的,与Mesos相似之处在于也是两层调度机制,不同在于考虑了资源抢占机制,能够处理任务的优先级对调度结果的影响。这些年发展迅速的Kubernetes也包含调度器,其本质上还是面向应用运行层面,默认调度器的策略比较丰富,扩展性也比较好,但在面对大规模的调度时,吞吐性能表现不是那么完美。

Apache Mesos

Apache Mesos将CPU、内存、存储和其他计算资源从机器(物理或虚拟)中抽象出来,使容错和弹性分布式系统能够轻松构建并有效运行。Mesos采用的Resource Offer使得任务框架能够自行决定是否接受Mesos Master的Offer,在实际使用过程中,资源框架中的调度机制需要用户自行实现,还是略微有些工作量的。

Firmament - 大规模集群任务调度

上述调度过程分为四个步骤:

Agent1 向Master汇报节点当前的资源情况,Master根据某种策略决定将Resource Offer给Framework1。

Master将Resource Offer给Framework1,即将Agent1的所有资源分配给Framework1使用。

Agent1 回复Master的Resource Offer,告诉Master将有两个任务运行在Agent1上,及各任务需要的资源情况。

最后,Master将任务发给Agent1,Agent1会为Framework的executor分配合适的资源,Framework的executor随即会启动两个任务。剩下的资源Master的Allocation Module会发Resource Offer给Framework2。

这里着重需要关注两个问题:

Mesos Master发送Resource Offer的时候,并不知道Framework的资源需求,如何知道该把Resource Offer发给哪个Framework?

在任务量比较大的时候,Framework 与Master通信的性能如何保证?

对于第一个问题,Mesos提供了"reject offer"的机制,允许Framework暂时拒绝不满足其资源需求的Resource Offer,具体拒绝的策略由各个框架自行决定。

因此在Master与Framework通信的问题上,Mesos提供了"filter"和"rescinds"机制,前者可以只接收剩余资源量大于L的Resource Offer,从而屏蔽掉部分流量,后者则允许某个Framework在一定的时间内没有为分配的资源返回对应的任务,则Mesos会回收其资源量,并将这些资源分配给其他framework。

Mesos调度采用Dominant Resource Fairness(DRF)策略,是一种支持多资源的max-min fair资源分配机制。在调度时先找出用户(这里指具体的Framework)的支配性资源,DRF将均衡所有用户的支配性资源,确保每个用户获取了最大比例的支配性资源。

Hadoop YARN调度

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/efcf6298870d9ffb2f0107985cab9416.html