互联网公司往往会有各种类型的工作任务,比如有对外提供的各种服务,也有内部的挖掘与数据管理系统。即使是内部数据系统也可能需要多种不同类型的计算系统:适应实时计算的挖掘系统、适合交互杳询场景的系统或者典型的批处理任务。面对多种各具特性的计算系统与框架,比较传统的资源管理方式采用的是静态资源划分方法,即将集群中的所有资源做出静态划分,将划分后的固定的硬件资源指定给固定的计算框架使用,各个框架之间各行其是,互不干扰。
静态资源划分方法是一种非常简便易行的资源管理方式,但是很明显资源的整体利用率不高,经常会出现集群中有些计算系统资源不足,但是有些计算系统存在大量闲置资源的情形。如何设计出好的资源管理与调度的策略和方法,使得整个集群的大量资源在能够实现更高资源利用率的同时加快所有计算任务的整体完成速度,这就是集群资源管理与调度系统的核心目标。
采用独立的资源管理与调度系统有以下好处。
1)集群整体资源利用率高。由于所有资源统一管理与调度,可以根据不同计算任务的及时需要动态分配资源,所以不会出现资源闲而不用。
2)可增加数据共享能力。
3)支持多类型计算框架和多版本计算框架。
一:资源管理抽象模型
模型主要强调三个要素
1)资源组织模型。主要是将集群中当前可用的各种资源采用一定的方式组织起来,以方便后续的资源分配过程。例如将资源组织成多层级队列的方式。
2)调度策略。负责以一定方式将资源分配给提交到系统的任务,常见的调度策略包括FIFO,公平调度,能力调度,延迟调度等。
3)任务组织模型。主要是将多用户提交的多任务通过一定方式组织起来,以方便后续资源分配。
二:设计方法
1)考虑到资源的异质性。比如数据中心的机器很难保证采用完全相同的配置,总会有机器高配置,也会有低配硬件。在做资源分配的时候,必须要考虑这种硬件的资源差异性,一般通过将资源分配单位细粒度划分为较小单元来解决这个问题
2)考虑到数据局部性。因为海量数据分布在大规模集群的不同机器中,如果移动数据会产生大量低效的数据网络传输开销,而计算代码相比而言数量小得多,所以移动计算代码到数据所在地而非移动数据,这一般称为“数据局部性”。
3)抢占式调度和非抢占式调度
4)资源分配粒度。大数据场景下的计算任务往往由两层结构构成:作业级和任务级。一个作业由多个并发的任务构成,任务之间的依赖关系往往形成有向无环图。一般分为全量分配资源和增量分配资源(分配部分资源就可以运行,随着空闲资源的不断出现,可以逐步分配给其他任务以维持运行)。MapReduce的批处理任务就采用了增量分配资源的策略。
5)资源隔离方法。目前对于资源隔离最常用的手段是Linux容器。YARN和Mesos都采用了这种方式。通过隔离可以用来进行资源和进行运行的隔离。
三:资源管理与调度系统范型
目前主要分为三种范型
1)集中式调度器:整个系统中只运行一个全局的中央调度器实例,所有之上的框架或者计算任务的资源请求全部经由中央调度器来满足,因此,整个调度系统缺乏并发性且所有调度逻辑全部由中央调度器来实现。
2)两级调度器:两级调度器将整个系统的调度工作分为两个级别:中央调度器和框架调度器。中央调度器可以看到集群中所有机器的可用资源并管理其状态,它可以按照一定策略将集群中的所有资源分配各个计算框架,中央调度器级别的资源调度是一种粗粒度的资源调度方式,各个计算框架在接收到所需资源后,可以根据自身计算任务的特性,使用自身的调度策略来进一步细粒度地分配从中央调度器获得的各种资源。
3)状态共享调度器:每个计算框架可以看到整个集群的所有资源,并采用互相竞争的方式去获取自己的资源,根据自身特性采取不同的调度策略,同时系统采用了乐观并发控制手段解决不同框架在资源竞争过程中出现的需求冲突。
CIO之家 www.ciozj.com 公众号:imciow