本文档描述了CapacityScheduler,这是Hadoop的可插入调度器,允许多租户安全地共享大型集群,以便在分配容量的约束下及时分配应用程序的资源。

Overview

CapacityScheduler被设计为以一种操作符友好的(operator-friendly)方式将Hadoop应用程序作为共享的、多租户的集群运行,同时最大化集群的吞吐量和利用率。

传统上,每个组织都有自己的私有计算资源集,这些计算资源具有足够的能力在峰值或接近峰值的情况下满足组织的SLA。这通常会导致较低的平均利用率和管理多个独立集群(每个组织一个集群)的开销。在组织之间共享集群是运行大型Hadoop安装的一种经济有效的方式,因为这允许它们在不创建私有集群的情况下获得规模经济的好处。然而,组织关心共享集群,因为他们担心其他人使用对其SLA至关重要的资源。

CapacityScheduler被设计为允许共享一个大型集群,同时为每个组织提供容量保证。核心思想是Hadoop集群中的可用资源由多个组织共享,这些组织根据计算需求共同为集群提供资金。还有一个额外的好处是,一个组织可以访问其他组织没有使用的任何过剩容量。这以成本效益的方式为组织提供了灵活性。

跨组织共享集群需要对多租户提供强有力的支持,因为必须保证每个组织的容量和安全性,以确保共享集群不受单个恶意应用程序或用户或其集合的影响。CapacityScheduler提供了一组严格的限制,以确保单个应用程序、用户或队列不能消耗集群中过多的资源。此外,CapacityScheduler还对来自单个用户和队列的初始化和挂起应用程序进行了限制,以确保集群的公平性和稳定性。

CapacityScheduler提供的主要抽象是队列的概念。这些队列通常由管理员设置,以反映共享集群的经济性。

为了提供对共享资源的进一步控制和可预测性,CapacityScheduler支持分级队列,这确保资源首先在组织的sub-queues之间空闲,然后才允许其他队列使用空闲资源,从而为某一组织的应用程序之间的共享资源提供紧密关联。

Features

CapacityScheduler支持以下特性:

  • 分级队列:支持队列分级,保证了在其他队列允许使用空闲资源之前,优先在组织的子队列之间进行共享,从而提供更多的控制和预测性。
  • 容量保证:队列只分配了网格容量的一小部分,这意味着一定的资源容量将由它们支配。所有提交到队列的应用程序都可以访问分配给队列的容量。管理员可以配置分配给每个队列的容量的软限制和可选的硬限制。
  • 安全性:每个队列都有严格的ACL,控制哪些用户可以将应用程序提交到各个队列。此外,还有一些安全防护措施,以确保用户不能查看和/或修改来自其他用户的应用程序。此外,还支持每个队列和系统管理员角色。
  • 弹性(Elasticity):可以将空闲资源分配给超出其容量的任何队列。当在未来某个时间点上,当这些资源上调度的任务完成时,若低于运行容量的队列需要这些资源时,它们将被分配到低于运行容量的队列上的应用程序(也支持抢占)。这确保以可预测的和弹性的方式向队列提供资源,从而防止集群中帮助利用资源的人为产生的竖井。
  • 多租户:提供了一组全面的限制,以防止单个应用程序、用户和队列独占队列或集群的资源,以确保集群不会不堪重负。
  • 可操作性
  • 运行时配置:管理员可以在运行时以安全的方式更改队列定义和属性(如容量、acl),以最小化对用户的干扰。此外,还为用户和管理员提供了一个控制台,以查看当前分配给系统中各个队列的资源。管理员可以在运行时添加其他队列,但不能在运行时删除队列。
  • Drain applications:管理员可以在运行时停止队列,以确保在现有应用程序运行到完成时,不能提交任何新应用程序。如果队列处于停止状态,则不能将新应用程序提交给它自己或它的任何子队列。现有的应用程序继续完成,因此可以优雅地清空队列。管理员还可以启动停止的队列。
  • 基于资源的调度:支持资源密集型应用程序,其中应用程序可以选择性地指定比默认值更高的资源需求,从而适应具有不同资源需求的应用程序。目前,内存是支持的资源需求。
  • 基于用户或组的队列映射:该特性允许用户根据用户或组将作业映射到特定的队列。
  • 优先级调度:该特性允许以不同的优先级提交和调度应用程序。整数值越大,表示应用程序的优先级越高。目前,应用程序优先级只支持FIFO顺序策略。