资源调度器是 hadoop yarn中最核心的组件之一,是resourcemanage中一个插拔式的服务组件,负责整个集群资源(container)的管理和分配。
背景:
hadoop最初设计目的是支持大数据批处理作业,如日志挖掘,web索引等作业,为此,hadoop仅提供了一个非常简单的调度机制:FIFO,即先来先服务,在该调度机制下,所有作业被统一提交到一个队列中,hadoop按照提交顺序依次运行这些作业。但是随着hadoop的普及,单个hadoop集群的用户量越来越大,不同用户提交的应用程序往往具有不同的服务质量要求(QoS),典型的应用有以下几种:
因为以上应用对硬件资源需求量也是不同的,如过滤,统计类作业一般为cpu密集型,数据挖掘,机器学习作业一般为io密集型。因此简单的fifo调度策略不仅不能满足多样化需求,也不能充分利用硬件资源。
解决方式有2种:
资源表示模型(container)
当前yarn支持内存和cpu两种资源类型的管理和分配,yarn采用了动态资源分配机制。nodemanager启动时会向resourceManager注册,注册信息中包含该节点可分配的cpu和内存总量。
ps:出了cpu和内存两种资源,服务器还有很多其他资源,比如磁盘容量,网络和磁盘io等,yarn可能在将来支持这些资源的调度。
yarn支持的 capacity scheduler和fair scheduler调度器对比:
名词解释:
是否支持动态加载配置文件:2种调度器的配置文件修改后是否能够动态生效。
是否支持负载均衡:fair schedler提供了一个基于任务数目的负载均衡机制,改机制尽可能将系统中的任务均匀分配到各个节点上,此外用户也可以根据自己的需要设计负载均衡策略。
是否支持资源抢占:每个队列可以设置一个最小资源量和最大资源量。为了提高资源利用率,资源调度器会将负载较轻的队列的资源暂时分配给负载较重的队列,仅当负载较轻的队列突然收到需要资源请求时,调度器才进一步将本属于该队列的资源分配给他,因为这个时候资源可能正在被别的队列使用,所以调度器要等那个队列释放资源释放资源才能将资源归还,这通常需要一段不确定的等待时间,为了防止应用程序等待时间太长,调度器等待一段时间后,发现资源并为得到释放,则进行资源抢占。
fifo:按照优先级高低调度,如果优先级相同,则按照提交时间先后顺序调度,如果提交时间也相同,则按照(队列或者应用程序)名称大小(字符串比较)调度。
fair:按照内存资源使用量比率调度,即按照used_memory/minshare大小调度(核心思想是按照该调度算法决定调度顺序。)如果一个队列中有2个应用程序同时运行,则每个得到1/2的资源,如果是3个则是1/3.
drf:按照主资源公平调度算法进行调度,drf被证明非常适合应用于多资源和复杂需求的环境中,因此被越来越多的系统采用,包括apache mesos。在drf算法中,将所需份额(资源比例)最大的资源成为主资源,而drf的基本设计思想则是将最大最小公平算法应用于主资源上。即drf总是最大化所有主资源中最小的。
假设系统中共有9个cpu和18gb ram,有2个用户分别运行了2种任务,分别需要的资源量为a:<1cpu,4gb>,b:<3cpu,1gb>对于用户a,每个任务要消耗总cpu的1/9和总内存的2.9,a的主资源为内存;b的主资源为cpu。
所以最终a的资源分配为:<3cpu,12gb>可以运行3个任务,b的资源分配为<6cpu,2gb>可运行2个任务。
|
|