介绍
在分布式计算中,调度器负责管理传入的容器请求,并确定接下来要运行哪些容器,在哪个节点上运行它们,以及在该节点上并行运行多少个容器。调度器的复杂性各不相同,最简单的调度器具有简单的先进先出 (FIFO) 策略。不同的调度器偏重于各种(某些层面上是相互冲突的)目标,例如:
尽可能充分利用集群资源
为每个用户和组提供对集群的公平访问权限
确保高优先级或对延迟敏感的作业按时完成
多租户分布式系统通常优先考虑用户和组之间的公平性,而不是最大资源使用;如果没有公平,用户可能会在不考虑其他人需求的情况下最大化他们自己对集群的资源占用。此外,不同的团体和业务部门将倾向于运行他们自己的较小、效率较低的集群以确保能够可控的访问使用。
在 Hadoop 的上下文中,最常用的两个调度器之一:容量调度器和公平调度器。从历史上看,每个调度程序都是作为简单 FIFO 调度程序的扩展编写的,并且最初每个调度程序都有不同的目标,正如它们的名称所示。随着时间的推移,这两个调度器经历了趋同的演变,每个调度器都吸收了彼此的改进;今天,它们在细节上大不相同。两个调度程序都具有要调度的多个作业队列的概念,每个队列的准入是根据用户或操作员指定的策略确定的。
Hadoop 在2.X版本后采用了两级调度,其中运行在 ResourceManager 节点上的集中式调度程序将集群资源(容器)分配给每个应用程序,运行在其中一个容器中的 ApplicationMaster 使用其他容器为应用程序运行单独的任务。ApplicationMaster 管理应用程序的细节,包括任务之间的通信和协调。这种架构比 Hadoop 最初的单级调度更具可扩展性,在后者中,单个中央节点(JobTracker)同时完成 ResourceManager 和每个 ApplicationMaster 的工作。
许多其他现代分布式系统,如 Dryad 和 Mesos,都有类似于 Hadoop 调度器的调度器。
公平调度的资源考量
从历史上看,大多数调度器在决定下一步调度哪个容器时只考虑单一类型的硬件资源:既计算每个节点上的空闲资源,也计算给定用户、组或队列已经使用了多少。对于 Hadoop,偏向于只考虑内存使用情况。
然而,在多租户分布式系统中,不同的作业和容器通常具有截然不同的硬件使用配置文件,一些容器需要大量内存,而一些则使用更多的 CPU(见图 2-1)。在调度中不考虑 CPU 使用率意味着系统可能未得到充分利用,一些用户最终会获得或多于或少于其真正公平的集群份额。一种称为主导资源公平性(DRF)的策略通过考虑多种资源类型并以通用货币表示每种资源的使用情况(该资源占总分配的份额),然后根据每个容器使用最频繁的资源进行调度来解决这些限制。
图 2-1。在生产集群的代表性时间段内,每个容器的物理内存使用情况与 CPU 使用情况。请注意,某些作业消耗大量内存,而使用相对较少的 CPU;其他人使用大量 CPU 但内存相对较少。
在 Hadoop 中,运营商可以配置 Fair Scheduler 和 Capacity Scheduler,以便在考虑在给定节点上接下来启动哪个容器时同时考虑内存和 CPU(使用 DRF 框架) 。