Hadoop 的YARN模块也具有为计算任务分配资源的能力,相应地也具有调度能力。YARN将应用的资源请求抽象为一个容器(Container),具体的Application Master会接收容器,然后在容器中启动这个任务。对于Hadoop来说,任务注意分为两类: Map 和 Reduce。
注意: 这里的容器不是云计算中所说的具体容器技术,而是Hadoop YARN中一个抽象的资源的集合的概念。
在MapReduce应用程序中,有多个map任务,每个任务都在集群中某个工作主机上的容器中运行。同样,还有多个reduce任务,每个还在运行主机上的容器中运行。
同时在YARN端,ResourceManager,NodeManager和ApplicationMaster一起工作以管理集群的资源,并确保任务以及相应的应用程序完整地完成。
调度本身并不是一个新的概念,个人计算机可以有多个CPU核,每个核运行一个进程,但同时运行多达几百个进程。调度程序是操作系统的一部分,它将进程分配给CPU内核以在短时间内运行。
对于大规模的计算集群也一样,应用程序由群集上的多个任务(通常在不同的主机上)组成。集群调度程序基本上必须解决:
多租户: 在群集上,许多用户代表多个组织启动了许多不同的应用程序。 集群调度程序允许不同的工作负载同时运行。即调度时必须考虑应用发起者的身份,根据身份将任务分发到与用户身份对应的资源上。
可伸缩性: 集群调度程序需要扩展到运行许多应用程序的大型集群。这意味着增加群集的大小应该可以提高整体性能,而不会对系统延迟产生负面影响。调度程序需要确保在计算集群规模非常大的时候,依然可以高效地提供调度服务。
YARN使用队列(Queue)在多个租户之间共享资源。当应用程序提交给YARN时,调度程序会将它们分配给队列。根队列是所有队列的父级。所有其他队列都是根队列或另一个队列(也称为分层队列)的子节点。队列通常与用户,部门或优先级相对应。Application Master跟踪每个任务的资源需求并协调容器请求。这种方式允许更好的扩展,因为RM/调度程序不需要跟踪在集群上运行的所有容器。
在YARN支持的调度程序中,公平调度(Fair Scheduler)是一个受欢迎的方式。在最简单的形式中,它在集群上运行的所有作业中公平地共享资源。
在实际的复杂调度场景中,还会有水平队列的形式出现,其实是上述队列的一种嵌套形式,即在队列的中还包含子队列,不同的子队列在父队列的权重的基础上有各自的权重设置,这里不再赘述。
Firmament 调度Firmament 通过对调度算法的优化使得大规模计算集群的任务调度可以很好地在性能和准确之间找到平衡。Firmament 的设计出发点主要有如下两个:
良好的决策很重要: 对于关键服务应用程序,单个糟糕的调度决策可能会产生重大影响。
灵活的策略是关键: 不同的用户和应用程序具有不同的调度需求,因此根据工作负载定制调度策略非常重要。
既要保证单个决策的准确性,又要保证调度策略的灵活性,这对于调度程序的性能提出了很高的要求,而Firmament的基于流图的决策模式能够有效解决这个问题。这个调度程序的核心来自于Google的开发者,开发语言为C++,目前作为一个开源项目,大家都可以共享自己的代码。Firmament主要有以下三个特性:
通过对图进行最小成本优化,Firmament根据调度策略为每个任务或容器找到最佳位置。
通过自定义底层图形并通过回调接口设置其边缘成本,用户可以自定义Firmament以应用自己的策略。
Firmament的增量最小成本,最大流量解算器甚至可以在Google规模(12k机器)上做出快速的亚秒级调度决策。
最重要一点: Firmament是全开源的。
Firmament既可以独立工作,也可以在集群管理器中工作,如Kubernetes这样的容器管理集群,开源项目Poseidon正是出于这样的目的,将Firmament引入容器管理集群。