Hadoop公平调度器算法解析
Download
Report
Transcript Hadoop公平调度器算法解析
Hadoop
组长:池涛
组员:王丽 谢兴波 谢赛男
大数据问题
纽约证券交易所每天产生1TB的交易数据
社交网站facebook的主机存储着约10亿张照片,占据PB级
存储空间
互联网档案馆存储着约2PB数据,并以每月至少20TB的速
度增长。
瑞士日内瓦附近的大型强子对撞机每年产生约15PB的数据
这么大的数据该怎么存储和读取?
传统关系型数据库(oracle)的成本
Facebook的服务器大概1万台,按照oracle
的标准10g版本计算大约需要21亿元
Hadoop简介
Hadoop 一个分布式系统基础架构,由Apache基金会开发。
用户可以在不了解分布式底层细节的情况下,开发分布式程
序。充分利用集群的威力高速运算和存储 。
由 HDFS 、MapReduce 、 HBase 、 Hive 和 ZooKeeper等
成员组成。其中, HDFS 和 MapReduce 是两个最基础最重
要的成员。
HDFS 是 Google GFS 的开源版本,一个高度容错的分布式
文件系统,它能够提供高吞吐量的数据访问,适合存储海量
( PB 级)的大文件(通常超过 64M ),其原理如图所示 :
Hadoop优点
可扩展:不论是存储的可扩展还是计算的可扩展都是
Hadoop的设计根本。
经济:框架可以运行在任何普通的PC上。
可靠:分布式文件系统的备份恢复机制以及MapReduce
的任务监控保证了分布式处理的可靠性。(元数据磁盘错
误,心跳测试,副本数,快照(目前还没实现))
高效:分布式文件系统的高效数据交互实现以及
MapReduce结合Local Data处理的模式,为高效处理海
量的信息作了基础准备。
Hadoop在国内的分布情况
Hadoop作业调度
默认调度算法FIFO
公平份额调度算法Fair Scheduler
计算能力调度算法Capacity Scheduler
作业调度总结
默认调度算法FIFO
简介
最早的Hadoop Map/Reduce计算架构中,JobTracker在进行作业调
度时使用的是FIFO(First In First Out)算法。所有用户的作业都被提
交到一个队列中,然后由JobTracker先按照作业的优先级高低,再
按照作业提交时间的先后顺序选择将被执行的作业。
优点
调度算法简单明了,JobTracker工作负担轻。
缺点
忽略了不同作业的需求差异。例如如果类似对海量数据进行统计分
析的作业长期占据计算资源,那么在其后提交的交互型作业有可能
迟迟得不到处理,从而影响到用户的体验。
新的调度算法
当前,新的调度器已经作为插件的形式集成在Hadoop当中。
公平份额调度算法Fair Scheduler
Fair Scheduler提出背景
Fair Scheduler基础知识
Fair Scheduler两个关键问题
Fair Scheduler的配置
Fair Scheduler提出背景
提出背景
Facebook要处理生产型作业(数据统计分析,hive)、大型批处
理作业(数据挖掘、机器学习)、小型交互型作业(hive查询)。
不同用户提交的作业在计算时间、存储空间、数据流量和响
应时间上都有不同需求。
为使hadoop mapreduce框架能够应对多种类型作业并行执
行,使得用户具有良好的体验,Facebook公司提出该算法。
Fair Scheduler基础知识
设计思想
尽可能保证所有的作业都能够获得等量的资源份额。系统中只有一
个作业执行时,它将独占集群所有资源。有其他作业被提交时就会
有TaskTracker被释放并分配给新提交的作业,以保证所有的作业
都能够获得大体相同的计算资源。
作业池
用户提交的作业将会放进一个能够公平共享资源的pool(池)中。
每个作业池设定了一个最低资源保障(a guaranteed minimum
share),当一个池中包含job时,它至少可以获得minimum share的
资源——最低保障资源份额机制。
池中的作业获得一定份额的资源。
可以通过配置文件限制每个池中的作业数量。
缺省情况下,每个作业池中选择将要执行的作业的策略是FIFO策
略,先按照优先级高低排序,然后再按照提交时间排序。
Fair Scheduler基础知识
作业和作业池的权值weight
缺省情况下,Fair Scheduler会为每一个用户建立一个单独
的pool。所有用户能够获得等量的资源份额而无论他提交了
多少作业,而每个pool中,各个作业将平分分配给所在池的
资源。
实际应用中,无论是作业池还是作业,都被赋予一定的权值,
并以此为依据获得相应比例的资源。这种情况下,作业池和
作业在资源分配时不是严格的平均分配,但这有利于根据作
业的重要程度及实际需求合理分配资源。
Fair Scheduler两个关键问题
如何选择合适的作业执行
默认是FIFO策略,此外还有一种基于缺额的策略。
Fair Scheduler为每个作业定义了一个deficit(缺额)指标。
Deficit是一个作业在理想情况下的获得的计算资源和实际中
获得的计算资源之间的差距。
Fair Scheduler会每隔几百毫秒观察每个作业中有多少任务
已经在这个时间间隔内执行,并将结果与它应得的资源份额
比较,以更新该作业的deficit值。一旦有空闲的task tracker
出现,首先分配给当前具有最高deficit值的作业。
例外——如果系统中存在着尚未获得最低资源保障的作业池,
那么该池中的作业将会优先调度,而选择池中的作业需要根
据它们的deficit来决定。这样做是为了尽可能满足作业池最
低保障资源份额的机制。
Fair Scheduler两个关键问题
如何确定每个作业的资源份额
缺省情况是平分资源,此外提供一种基于权值的资源分配方
法。
作业资源份额的计算是根据作业的权值将集群的资源总量划
分给各个可以运行的作业。
默认情况下,权值基于作业优先级,每个优先级对应的权值
是低一个优先级的2倍(优先级共有VERY_HIGH, HIGH,
NORMAL, LOW, VERY_LOW五个等级,则VERY_HIGH具
有4倍NORMAL的权值)。
作业和作业池的权值可以在池配置文件中进行设定,例如可
以基于作业的大小和提交时间来设定。
作业池的最低资源保障也是按照权值比例分配给其中的作业。
计算能力调度Capacity Scheduler
Capcity Scheduler基础知识
Capcity Scheduler一个关键问题
Capcity Scheduler内存管理
Capcity Scheduler的配置
Capcity Schedule基础知识
基础知识
Capacity Scheduler是由雅虎提出的作业调度算法,它提供了
类似于Fair Scheduler算法的功能。
Capacity Scheduler中可以定义多个作业队列(multiple
queues),作业提交时将直接放入到一个队列中。
每个队列都可以通过配置获得一定数量的task tracker资源用
于处理map/reduce操作,调度算法将按照配置文件为队列分
配相应的计算资源量。
对于已经分配给了某队列但处于空闲的资源各个“忙”的队列
会分享它们。当某一队列没有能够按照配置的数量值获得足
够资源但是它的作业压力增加了时,之前那些曾分配给它但
又由于之前空闲被别的队列所占用了的资源会在完成当前
task后立即分配给回应属的队列。
Capcity Schedule基础知识
基础知识
Capacity Scheduler的每个队列中采用的调度策略是FIFO算法。
Capacity Scheduler默认情况下不支持优先级,但是可以在配
置文件中开启此选项,如果支持优先级,调度算法就是带有
优先级的FIFO。
Capacity Scheduler不支持优先级抢占,一旦一个作业开始执
行,在执行完之前它的资源不会被高优先级作业所抢占。
Capacity Scheduler对队列中同一用户提交的作业能够获得的
资源百分比进行了限制以使同属于一用户的作业不能出现独
占资源的情况。
Capcity Scheduler一个关键问题
如何选择合适的作业去执行
为队列定义了一个指标—队列中正在运行的任务数与其应该分
得的计算资源(配置文件中为此队列分配了相应数量的资源,
而实际中该队列可能没有分配到)之间的比值。当系统中出现
空闲的task tracker,算法会首先选择一个该比值最低的队列。
队列被选中后,将按照作业优先级(如果支持的话)和提交时间
顺序选择执行的作业。
在选择作业的时候,还需要考虑作业所属的用户是否已经超出
了他所能使用的资源限制。
此外,还会考虑task tracker内存资源是否满足作业的要求。
Capcity Scheduler内存管理
内存资源的有效管理
Capacity Scheduler能有效地对hadoop集群的内存资源进行
管理,以支持内存密集型应用。
作业对内存资源需求高时,调度算法将把该作业的相关任务
分配到内存资源充足的task tracker上。
在作业选择过程中,Capacity Scheduler会检查空闲task
tracker上的内存资源是否满足作业要求。task tracker上的空
闲资源(内存)数量值可以通过task tracker的内存资源总量减
去当前已经使用的内存数量得到,而后者包含在task tracker
向job tracker发送的周期性心跳信息中。
目前,基于内存的调度只能在linux平台下起作用,关于内存
调度的相关参数可以通过配置文件来设置。
Hadoop公平调度器算法解析
※公平调度介绍
※hadoop-0.20.2公平调度算法分析
基于缺额的调度算法
1. 变量定义
2. 相关算法
※hadoop-0.21.0公平调度算法分析
层次调度算法
公平调度介绍
公平调度器按资源池(pool)来组织作业,并把资源公平
的分到这些资源池里。默认情况下,每一个用户拥有一个
独立的资源池,以使每个用户都能获得一份等同的集群资
源而不管他们提交了多少作业。按用户的 Unix 群组或作
业配置(jobconf)属性来设置作业的资源池也是可以的。
在每一个资源池内,会使用公平共享(fair sharing)的方
法在运行作业之间共享容量(capacity)。用户也可以给
予资源池相应的权重,以不按比例的方式共享集群。
公平调度介绍
除了提供公平共享方法外,公平调度器允许赋给资源池保
证(guaranteed)最小共享资源,这个用在确保特定用户
、群组或生产应用程序总能获取到足够的资源时是很有用
的。当一个资源池包含作业时,它至少能获取到它的最小
共享资源,但是当资源池不完全需要它所拥有的保证共享
资源时,额外的部分会在其它资源池间进行切分。
公平调度介绍
主要特点如下:
Ø 支持多用户多队列
Ø 资源公平共享(公平共享量由优先级决定)
Ø 保证最小共享量
Ø 支持时间片抢占
Ø 限制作业并发量,以防止中间数据塞满磁盘
Pool
资源池,或者作业池。 每个pool里有一定量的资源(管理
员配置),每个用户属于某个pool,其作业可使用这个
pool中的资源,可限定每个pool中最大并发作业数和每个
用户最多提交作业数。默认情况下,一个linux用户对应一
个pool,而管理员也可以配以一个linux group对应一个
pool。pool实际上也可以称为group或者队列。
最小共享量
管理员可给每个pool配置一个最小共享量,调度器在分配
资源时,需要保证每个pool中的作业至少获取该数目的资
源。一个常见的应用场景是,对产品pool设置最小共享量
,而测试pool不设置,这样,当可用资源有限时时,优先
保证产品pool有资源可用。
公平共享量
当集群中存在多个pool时,某些pool中的资源可能用不了
,这时候调度器会自动将这些pool中剩余的资源共享给其
他需要的pool,其他这些pool获取的共享资源多少主要由
其pool weight决定,pool weight越大,获取的资源越多。
一个pool的最小共享量加上其获取的共享资源数目,就是
公平共享量。
公平调度算法分析——变量定义
★描述job信息的变量(JobInfo)
jobWeight:作业的权重。实际计算时,map阶段和
reduce阶段分开,分别记为mapWeight,reduceWeight
jobDeficit:作业的缺额,即作业在理想调度器上所应得
的计算时间与实际所获得的计算时间的缺额,这个是测量
作业的“不公平”待遇的度量标准。实际运算时将map阶
段和reduce阶段分开,分别记为mapDeficit和
reduceDeficit。
公平调度算法分析——变量定义
runningTasks:作业正在运行的task数。实际计
算时,map task和reduce task需分开,分别记为
:runningMaps和runningReduces
minSlots:作业在相应的pool中的最小slot保证量
,实际计算时,map阶段和reduce阶段分开,分
别记为:minMaps和minReduces
jobFairShare:上次更新给该job分配的公平共享
量,实际计算时,map阶段和reduce阶段分开,
分别记为mapFairShare和reduceFairShare
公平调度算法分析——变量定义
★计算过程的中间变量
poolWeight:pool的权重,这个
可由用户自己设定,默认为1。
priority
priorityFactor
VERY_HIGH
4.0
tasksNum:某个作业正在运行
任务与尚未运行的任务(包括
Speculative 任务)数量和,有
两种task类型:map task和
reduce task,计算时需要分开
HIGH
2.0
NORMAL
1.0
priorityFactor:与作业优先级
相关的因子,用于计算作业的权
重,具体如图:
LOW
0.5
Default
0.25
公平调度算法分析——变量定义
poolRunningJobsWeightSum:pool中已经开始运行的所
有作业的权重之和
poolLowJobsWeightSum:在某个pool中,已经开始运行
的,但尚需slot(tasksNum数量大于其最小共享量)的那
些作业权重之和
systemJobsWeightSum:系统(可能有很多pool)中可
以运行的所有作业的权重之和
timeDelta:两次信息更新的时间间隔
公平调度算法分析——相关算法
当出现一个空闲slot时,公平调度器会将此slot分配给缺额
最大的作业。系统每隔500毫秒(UPDATE_INTERVAL
)更新一次信息(有一个专门的更新线程对job信息进行更
新),包括:作业缺额(作业的其他属性,如权重、最小
共享量、公平共享量等,均是为计算缺额服务的)、权重
、最小共享量、公平共享量等。
公平调度算法分析——相关算法
1) 作业权重计算方法
(1)默认情况下,权重是基于作业优先权的,但也可以基
于作业的大小和年龄。权重的计算方法如下:
(2)根据优先权计算权重:
(3)根据用户自定义的weightAdjuster类调整权重
公平调度算法分析——相关算法
2) 更新权重
每个已经运行的作业权重更新公式:
3) 初始缺额计算
每个作业的初始缺额mapDeficit,reduceDeficit设置为0.
4) 更新作业的最小共享量
在每个pool中,将其拥有的slot按作业的权重分配给各个
作业(由步骤(1)完成),分完之后将剩余的slot按作业的
权重和缺额分配给仍需slot的作业(由步骤(2)和(3)完成)
,如果还有slot剩余,则将这些slot共享给其他pool。
公平调度算法分析——相关算法
初始化:
当前所有作业的最小共享量置零;
pool的minMaps数或者minReduces数(由用户在配置文件
中设定)
重复以下几步,直到slotsLeft=0:
公平调度算法分析——相关算法
(1)计算每个job的最小共享量:jobinfo.minMaps或jobinfo.minReduces
首先计算该作业可获得的共享值:
根据当前pool的剩余slot数,调整该共享值:
其中runnableNum表示作业尚需的slot数与正在运行的slot数之和,curMin
表示作业的当前最小共享量(jobinfo.minMaps或jobinfo.minReduces),
初始值为0。将slotsToGive作为最小共享量赋予相应的job。修改值为值减
去slotsToGive。
如果此轮循环中,slotsLeft值未变,即没有slot分给任何作业,则将剩余
的slot共享给pool中所有job,即,执行(2)(3)并结束算法:
公平调度算法分析——相关算法
(2)将pool中的job按weight和deficit排序
(3)按顺序依次计算每个job的最小共享量。
首先计算该作业可获得的共享值:
根据当前pool的剩余slot数,调整该共享值:
将slotsToGive作为最小共享量赋予相应的job。修改slotsLeft
值为slotsLeft值减去slotsToGive。
需要注意的是,当执行完(2)(3)后,slotsLeft可能仍大于
0,这时候会将剩余的slotsLeft个slot共享给其他pool。
公平调度算法分析——相关算法
5) 更新公平共享量
主要思想:基于作业权重和最小共享量计算公平共享量。
首先,根据权重分配可用slot数,如果作业的最小共享量
大于公平共享量,先要满足最小共享量,更新可用slot数
,重复以上步骤,直到所有作业的最小共享量小于或等于
公平共享量,这样,每个作业的最小共享量都得到了满足
,最后,所有作业平分剩下的slot数。
公平调度算法分析——相关算法
算法实现:
初始化:当前所有作业的公平共享量置零;slotsLeft={系统中map
slot 或者reduce slot 总数};jobsLeft={系统中正在运行的作业}
(1) 遍历集合jobsLeft中的所有作业,计算每个作业的jobFairShare
:
如果作业的最小共享量(minSlots)大于公平共享量(jobFairShare
),则:将最小共享量作为公平共享量赋值给作业。同时将此作业从
集合jobsLeft中删除。
(2)将剩下的slot按权重比例给集合jobsLeft中剩余的作业:
将jobFairShare作为公平共享量赋值给作业。
公平调度算法分析——相关算法
6) 更新缺额
实际计算时,会分开:
7) 资源分配
当系统中产生一个空闲slot时,将此slot分配给缺额最大的
作业。
Hadoop-0.21.0版本公平调度器新特性
(1) 将之前(0.21.0之前版本)的基于缺额的调度算法改为
层次调度算法
(2) 支持资源抢占
(3) 添加delay scheduling机制,使调度策略更优。
(4) 每个队列的调度策略可以配置,支持两种调度策略,
分别为FIFO和FAIR,不管采用哪种调度策略,以上三个
功能全部支持。
层次调度算法
大的思想与Capacity Scheduler类似,首先选择一个pool
,然后从该pool中选择一个job,最后从该job中选择一个
locality的task。
其中,选择pool和job的策略相同,均采用了
FairShareComparator比较器对pool或者job进行排序,然
后从头到尾扫描队列,选出合适的pool或者job。在
FairShareComparator中,Schedulable封装了是一个pool
或者job的基本信息。
资源抢占
当一定时间(管理员可配置)内,某个pool中获取的资源
量少于最小共享量,或者公平共享量的一半,则调度器会
找出哪个pool抢占了该pool的资源,并杀死相应数量的
task以抢占资源。
之所以要进行抢占,还是为了“公平”,即:保证每个
pool能获取到它应得到的资源。
delay scheduling机制
当出现空闲slot时,如果排在队列前面的job对应的所有
task均没有locality特性,则该作业会延迟调度,直到一段
时间后,该job出现locality的task或者发生超时,才不得
不调度该job的task。
有些人可能不了解locality,在此解释如下:当出现空闲
slot时,该slot来自某个节点,而该节点上存有部分数据,
如果某个task所需要的数据正好位于该节点上,则将该
slot分配给该task是非常好的,因为它避免了通过网络读
取数据。
公平共享量计算方法
公平共享量是基于最小共享量和共享资源量计算得到的,它反映的
是某个pool经过资源共享(某些pool的资源用不了,会自动共享给
其他pool)之后,一共可以获取的资源总量,一般会大于等于最小
共享量。
如果每个pool没有配置最小共享量,且提交了无限量的作业,则让
每个pool的slotsAssigned / weight值相同即可。(其中
slotsAssgined表示分配给该pool的slot数,weight表示pool的权重
)。
而有了最小共享量minShare和pool中的需求量demand(该pool中
所有作业尚需的slot总数)后,计算公平共享量fairShare需注意以
下两种情况:
(1) 某些pool中的最小共享量可能用不完
(2) 给配给某些pool的资源量小于其最小共享量
公平共享量计算方法
考虑到以上两种情况,调度器设计了基于比率R的公平资源
分配方法(设集群中资源总量为totalSlots):
[1] 如果一个pool的demand<R*weight,则该pool的
fairShare=demand
[2] 如果一个pool的minShare>weight,则该pool的
fairShare=minShare
[3] 除此之外,所有pool的fairShare=R*weight
[4] 所有pool的的fairShare之和应为totalSlots
通过以上算法计算出的公平共享量即为“公平调度器”的“
公平”含义之所在,应尽量保证每个pool获取的资源量为
fairshare,如果一定时间期限内达不到,则抢占资源。
公平共享量计算方法
公平调度器缺点
新版本的调度器仍不支持大内存作业,而Capacity
Scheduler则早有了支持,其原理是:如果一个job需要较
大内存,调度器会为该job分配多个slot,这样,作业可使
用这些slot对应的内存资源。
谢谢观赏