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对应的内存资源。
谢谢观赏