第10章 Hadoop多用户作业调度器

Hadoop最初是为批处理作业而设计的,当时仅采用了一个简单的FIFO调度机制分配任务。但随着Hadoop的普及,单个Hadoop集群中的用户量和应用程序种类不断增加,适用于批处理场景的FIFO调度机制不能很好地利用集群资源,也不能够满足不同应用程序的服务质量要求,因此,设计适用于多用户的作业调度器势在必行。

从目前看来,多用户作业调度器的设计思路主要有两种:第一种是在一个物理集群上虚拟多个Hadoop集群,这些集群各自拥有全套独立的Hadoop服务,比如JobTracker、TaskTracker等,典型代表是HOD(Hadoop On Demand)调度器;另一种是扩展Hadoop调度器,使之支持多个队列多用户,典型代表是Yahoo!的Capacity Scheduler和Facebook的Fair Scheduler。本章将重点介绍这两种多用户作业调度器的应用场景和设计原理。

10.1 多用户调度器产生背景

Hadoop最初的设计目的是支持大数据批处理作业,如日志挖掘、Web索引等作业,为此,Hadoop仅提供了一个非常简单的调度机制:FIFO,即先来先服务。在该调度机制下,所有作业被统一提交到一个队列中,Hadoop按照提交顺序依次运行这些作业。

但随着Hadoop的普及,单个Hadoop集群的用户量越来越大,不同用户提交的应用程序往往具有不同的服务质量要求(Quality Of Service, QoS),典型的应用有以下几种。

❑批处理作业:这种作业往往耗时较长,对完成时间一般没有严格要求,如数据挖掘、机器学习等方面的应用程序。

❑交互式作业:这种作业期望能及时返回结果,如SQL查询(Hive)等。

❑生产性作业:这种作业要求有一定量的资源保证,如统计值计算、垃圾数据分析等。

此外,这些应用程序对硬件资源的需求量也是不同的,如过滤、统计类作业一般为CPU密集型作业,而数据挖掘、机器学习作业一般为I/O密集型作业。因此,传统的FIFO调度策略不仅不能满足多样化需求,也不能充分利用硬件资源。

为了克服单队列FIFO调度器的不足,多种类型的多用户多队列调度器诞生了。这种调度器允许管理员按照应用需求对用户或者应用程序分组,并为不同的分组分配不同的资源量,同时通过添加各种约束防止单个用户或者应用程序独占资源,进而能够满足各种QoS需求。当前主要有两种多用户作业调度器的设计思路:第一种是在一个物理集群上虚拟多个Hadoop集群,这些集群各自拥有全套独立的Hadoop服务,比如JobTracker、TaskTracker等,典型的代表是HOD调度器;另一种是扩展Hadoop调度器,使之支持多个队列多用户,这样,不同的队列拥有不同的资源量,可以运行不同的应用程序,典型的代表是Yahoo!的Capacity Scheduler和Facebook的Fair Scheduler。接下来将分别介绍这两种多用户作业调度器。