YARN基础知识
(1)YARN作为分布式计算
(1)YARN(集群计算层)运行在存储层上(如:HDFS和HBase)
(2)应用层(如:mapreduce,spark等)都运行在Compute层(YARN)上
(2)YARN的应用运行机制
里面的容器可以是一个unix进程,也可以是一个Linux cgroup,取决于YARN的配置。
(1)客户端应用提交YARN应用给ResourceManager
(2)ResourceManager寻找一个NodeManager1,NodeManage1r启动容器(线程等)去执行某一个应用流程
(3)NodeManager1每个心跳时间将最新计算结果返回给ResourceManager,或者向ResourceManager请求资源分配。
(4)NodeManager1如果发现需要进行分布式计算就会启动其他的NodeManager
YARN自身不会为应用的各部分(客户端、master、进程)提供通讯手段,大多数的YARN的远程调用机制都是各种软件独有的机制(如Hadoop的RPC层)
(3)资源请求
通常情况下,当启动容器处理某个HDFS数据块(mapreduce中的某一个map)时,应用申请节点:
- 存储该数据的三个复本所在的节点
- 存储这些节点所在机架上的节点
- 以上两个方式都失败了,则申请集群中的任意节点
(4)应用生命周期
YARN应用的生命周期差异很大:
- 最简单的模型时一个用户作业对应一个应用,这是mapreduce的方式
- 作业的每个工作流或者是每个会话(可能并无关联性)对应一个应用。这种方法比第一种情况效率更高,因为容器可以在作业之间实现重用,并且有可能缓存作业之间的数据,spark采用了这种方式。
- 多个用户共享一个运行的应用。Apache Slider有一个长期运行的application master,这个application master用于启动集群上的其他应用
(5)mapreduce1和YARN的比较(hadoop1与hadoop2的比较)
- 我们可能会用mapreduce1来表示Hadoop1,区别于使用了YARN的mapreduce2.
(1)Mapreduce1中有两类守护进程控制着执行过程:一个jobtracker以及tasktracker。jobtracker调度tasktracker上的任务来协调运行在系统上的作业。tasktracker运行任务并且将人物的进度报告发给jobtracker。
(2)Mapreduce1中的jobtracker同时负责作业调度和任务进度的监控。相比之下YARN中这些指责是分开的,分为:resource manager和application master(每个mapreduce作业有一个)
Mapreduce1与YARN在组成上的比较:
Mapreduce1 | YARN |
---|---|
jbotracker | 资源管理器、aplication master、时间轴服务器 |
Tasktracker | 节点资源管理器 |
Slot | 容器 |
-
可扩展性
Mapreduce1的任务到达40000时,会遇到可扩展的瓶颈,瓶颈源自于jobtracker必须同时管理作业和任务。YARN利用resource manager和application分离的架构特点克服了这一局限性,可以扩展到奖金10000个节点和100000个任务。 -
高可用性
jobtracker内存中大量快速的变化的复杂状态使得改进jobtracker服务非常困难。
YARN中jobracker在资源调度器和application master分开,高可用性也可以分治:先为manager master实现高可用,在针对YARN应用实现高可用。
(6)YARN中的资源调度
- 调度分为三种:FIFO调度器,容量调度器,公平调度器。
- FIFO调度器遵循先进先出的原则,FIFO调度器的特点是,简单易懂,不需要配置,但是不适合共享集群,大的应用会一直占用集群中的资源,其他应用会一直等待大的资源释放资源后执行。
- 容量调度器:小的作业会优先执行,大的作业会等待前面的小作业执行完成方可执行,这也意味着与FIFO相比,大的作业需要等待的时间更长。
conf/yarn-site.xml 配置启用Capacity调度器:
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>
弹性队列:多个作业同时工作时,按照分配的比例A占30%资源,当队列A中的资源已经占用了全部的30%时,而其他的队列仍然有可用资源,这时A会抢占其他队列的资源。这称之为“弹性队列”。
容量调度器不会通过中断其他队列的方式来抢占容器。因此,如果一个队列A资源不够时,会抢占其他队列的资源,为了缓解A过分抢占其他队列的资源,可以设置一个最大容量限制,这样A就不会过多的抢占其他队列的资源。
修改capacity-scheduler.xml文件来配置用户下的队列:
配置的含义:
(1)root下的队列有两个prod和dev
(2)dev下的有eng和science
(3)prod队列的容量调度设置为40%,prod队列没有设置最大容量,如果dev空闲,prod队列可以占用全部的资源。
(4)dev队列的容量调度设置为60%
(5)dev可以使用资源的最大容量为75%(弹性队列的最大容量),也就是说就算prod队列空闲,dev队列最多也就只能占用75%的资源
(6)dev下的eng队列最大容量为50%
(7)dev下的science队列最大容量为50%,eng和science平分dev下的资源
将应用放置在哪个队列中,取决于应用本身,在mapreduce中,可以通过设置mapreduce.job.queuename来指定,如果不指定就会被放置在一个名为“defualt”的队列中。
- 公平调度机制
- 两个队列A和队列B,如果队列A启动,B未启动,A占据所有的资源
- 如果此时B也启动,则A和B各占50%
- 此时B启动第二个队列,此时A和B各占一半50%,B中的两个应用各占25%
启动公平调度机制:在yarn-site.xml中
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
</property>
在fair-scheduler.xml中配置公平调度器:
当集群资源按照40:60的比例将资源分配给eng和prod时,集群被认为是公平的,end和science队列没有指定权重,因此他我们会平均分配。(没有指定时队列的权重为1,故end和science队列的资源比例为1:1).
下面配置的quequePlacementPolicy表示会依次匹配下面规则:
(1)specified表示把应用放到所知名的队列中,如果没有指明,或者不存在则匹配下一条
(2)primaryGroup会尝试把应用放到以用户的主Unix组名命名的队列中,如果没有这样的队列,匹配下一条
(3)Default规则是一条兜底规则,当上面都不匹配时,就将其放入到dev.end队列中。
通过将yarn.scheduler.fair.preemption设置为true,可以全面启动抢占功能。有两个抢占的超时设置:一个用于最小共享(minimum share preemption timeout),另一个用于公平共享(fair share preemption timeout)。
- 如果在队列中设置minimum share preemption timeout,如果在指定的时间内未获承诺的最小资源,调度器就会抢占其他容器。
- 如果队列在fair share preemption timeout指定的时间内获得的资源低于其公平共享份额的一半,就会抢占其他容器。
- 延迟调度
如果一个应用请求某个节点,那么极有可能此时其他容器在该节点运行,通过实践发现,此时如果等待一段时间,能够戏剧性的增加在所请求的节点上分配到的容器的机会,从而提供容器的效率。容量调度器和公平调度器都支持延迟调度。
YARN中的心跳中携带了很多正在运行容器的状态信息和新容器的可用信息。这对于每一个计划运行一个容器的应用而言,都是一个调度机会。
- 设置yarn.scheduler.capacity.node-locality-delay来配置延迟调度。设置为正整数。表示调度器再放松节点限制,改为匹配同一个机架上的其他节点前,准备错过调度机会的数量。
2.设置yarn.scheduler.fair.locality.threshold.node为0.5,表示调度器在接受同一机架中的其他节点之间,一直等待直到集群中的一半的节点都给过了调度的机会。相关属性yarn.scheduler.fair.locality.threshold.rack表示接受另一个机架替代所申请的机架之前需要等待的时长阈值。
- 主导资源公平性
如果一个用户的应用对CPU的需求很大,但对内存的需求很少;另一个用户需要很少的CPU,但对于内存的需求很大。那么如何比较两个应用?
YARN中调度器解决这个问题的思路是,观察每个用户的主导资源,将其作为资源配置时的度量。这个方法叫做“主导资源公平性原则”(Dominant Resource Fairness,DRF)。
举个例子:
一个共有100个CPU和10TB的集群。应用A请求的每份容器资源为2个CPU和30GB的内存,应用B请求的每份资源为6个CPU和100GB内存。A请求的资源占总资源的比例为2%和3%。由于3%(内存)大于2%(CPU),故内存是A的主导资源。B请求的资源在集群资源中占比分别为6%和1%,所以CPU为B的主导资源。由于B申请的资源是A的两倍(6%比3%),所以在公平调度下,B将分到一半的容器数。
默认情况下不用DRF,因此在资源计算期间,只要考虑内存,不必考虑CPU。
(1)对容量调度器进行配置以后,可以使用DRF,将capacity-scheduler.xml文件中的org.apache.hadoop.yarn.util.resource.DominantResourceCalculator设为yarn.scheduler.capacity.resource-calculator.
(2)公平调度器若想要使用DRF,可以将分配文件中的顶层元素defaultQueueSchedulingPolicy设置为drf即可。