yarn由两部分组成:
从客户端向yarn提交的应用,最终都根据其资源需求,被放在NodeManager的容器中执行。yarn会对每个应用启动一个ApplicationMaster,它负责收集和监控该应用在其它NodeManager容器中执行的分布式任务状态,并和ResourceManager进行资源协调(具体同ResourceManager中的Scheuler)。图中绿色的模块即为一个应用在NodeManager中的分布式运行结构。
ResourceManager由两部分组成:
总结来看:
yarn提供了一个分布式的资源管理和任务执行管理平台。yarn相当于一个分布式的操作系统,管理资源和任务执行
其中的ResourceManager的ApplicationMananger负责管理应用的ApplicationMaster
ApplicationMaster又负责管理自己具体的所有分布式任务
hadoop 2.6.0提供了两种scheduler
两者都是基于队列。前者是yahoo开源贡献的,后者是facebook开源贡献的。重点介绍Fair Scheduler ,也是cdh官方推荐的scheduler
最新的yarn版本支持更细粒度的资源管理。加入了ReservationSystem,可以对job的资源做deadline限制,以及可预期的任务做资源保留
cpu, 内存。配置参数
<?xml version="1.0"?>
<allocations>
<queue name="sample_queue">
<minResources>10000 mb,0vcores</minResources>
<maxResources>90000 mb,0vcores</maxResources>
<maxRunningApps>50</maxRunningApps>
<maxAMShare>0.1</maxAMShare>
<weight>2.0</weight>
<schedulingPolicy>fair</schedulingPolicy>
<queue name="sample_sub_queue">
<aclSubmitApps>charlie</aclSubmitApps>
<minResources>5000 mb,0vcores</minResources>
</queue>
</queue>
<queueMaxAMShareDefault>0.5</queueMaxAMShareDefault>
<!—- Queue 'secondary_group_queueue' is a parent queue and may have
user queues under it -->
<queue name="secondary_group_queue" type="parent">
<weight>3.0</weight>
</queue>
<user name="sample_user">
<maxRunningApps>30</maxRunningApps>
</user>
<userMaxAppsDefault>5</userMaxAppsDefault>
<queuePlacementPolicy>
<rule name="specified" />
<rule name="primaryGroup" create="false" />
<rule name="nestedUserQueue">
<rule name="secondaryGroupExistingQueue" create="false" />
</rule>
<rule name="default" queue="sample_queue"/>
</queuePlacementPolicy>
</allocations>
<queue name="sample_queue">
<minResources>10000 mb,0vcores</minResources>
<maxResources>90000 mb,0vcores</maxResources>
<maxRunningApps>50</maxRunningApps>
<maxAMShare>0.1</maxAMShare>
<weight>2.0</weight>
<schedulingPolicy>fair</schedulingPolicy>
</queue>
<queue name="root">
<weight>1.0</weight>
<schedulingPolicy>drf</schedulingPolicy>
<aclSubmitApps>*</aclSubmitApps>
<aclAdministerApps>*</aclAdministerApps>
<queue name="flink">
<weight>10.0</weight>
</queue>
<queue name="test1">
<weight>60.0</weight>
</queue>
<queue name="test2">
<weight>30.0</weight>
</queue>
</queue>
<maxRunningApps>10</maxRunningApps>
<maxAMShare>0.3</maxAMShare>
<aclSubmitApps>user1,user2,user3,... group1,group2,...</aclSubmitApps>
<aclAdministerApps>userA,userB,userC,... groupA,groupB,...</aclAdministerApps>
使用权重时,为了最大化集群资源利用率。在集群空闲时,繁忙的A队列会获得超出自己权重比例的资源,以使其快速执行。
但此时B队列有一个任务需要执行,B队列的资源被A队列占用,B队列只有等待A队列中的任务执行完成释放属于自己的资源
但如果A队列一直有任务执行,B队列就要一直等下去,为了避免这种情况发生,需要引入抢占机制
在B队列中配置自己能忍耐的极限,超过则要求fair scheduler帮忙抢资源,杀死A队列中的任务,释放资源
首先在yarn-site.xml中启用抢占功能
<property>
<name>yarn.scheduler.fair.preemption</name>
<value>true</value>
</property>
然后在fair-scheduler.xml 对应的队列中配置
<queue name="B">
<weight>10.0</weight>
<fairSharePreemptionTimeout>60</fairSharePreemptionTimeout>
<fairSharePreemptionThreshold>0.5</fairSharePreemptionThreshold>
</queue>
那如果A队列本身的任务非常重要,不允许执行过程中被杀,那么需要以下配置
<queue name="B">
<weight>10.0</weight>
<allowPreemptionFrom>false</allowPreemptionFrom>
</queue>
前面说了队列之间通过权重、或具体大小来划分集群资源。但队列内部对于先后提交的多个任务有以下几种调度方式
基于内存做公平调度。而不不同应用对cpu的的需求
先进先出,优先保证先提交到队列的应用所需要的所有资源,有空闲再给后续任务
基于应用申请内存和cpu所在总资源的比例大小来选取占绝对主导权的(dominant)比例
假设总的队列资源是100 CPUs, 10000 GB Memory
A应用程序需求的资源是:2 CPUs, 300 GB Memory,其申请各项的占比为 2% of CPUs vs 3% of Memory
B应用程序需求的资源是:6 CPUs, 100 GB Memory ,其申请的各项占比为 6% of CPUs vs 1% of Memory
所以A占主导的内存申请,%3
B的占主导的应该是cpu申请,%6
B的主导比例是A的两倍,所以B会获得多余A两倍的资源
对应论文:https://people.eecs.berkeley.edu/~alig/papers/drf.pdf
<queuePlacementPolicy>
<Rule #1>
<Rule #2>
<Rule #3>
.
.
</queuePlacementPolicy>
规则的种类有
<rule name=”specified” create=”false”>
<rule name="user"/>
<rule name="primaryGroup"/>
<rule name="secondaryGroupExistingQueue"/>
<rule name="nestedUserQueue" create=”true”>
<!-- Put one of the other Queue Placement Policies here. -->
</rule>
<rule name="default" queue="default" />
<rule name="reject"/>
<rule name="nestedUserQueue" >
<rule name="primaryGroup" create="true" />
</rule>
兜底,以上所有规则不满足,default为使用默认规则,reject为直接拒绝掉
对应xml配置
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<allocations>
<queue name="root">
<weight>1.0</weight>
<schedulingPolicy>drf</schedulingPolicy>
<aclSubmitApps>*</aclSubmitApps>
<aclAdministerApps>*</aclAdministerApps>
<queue name="default">
<weight>1.0</weight>
<schedulingPolicy>drf</schedulingPolicy>
</queue>
<queue name="flink">
<weight>10.0</weight>
<fairSharePreemptionTimeout>60</fairSharePreemptionTimeout>
<fairSharePreemptionThreshold>0.5</fairSharePreemptionThreshold>
<allowPreemptionFrom>false</allowPreemptionFrom>
<schedulingPolicy>drf</schedulingPolicy>
</queue>
<queue name="azkaban" type="parent">
<weight>60.0</weight>
<fairSharePreemptionTimeout>60</fairSharePreemptionTimeout>
<fairSharePreemptionThreshold>0.5</fairSharePreemptionThreshold>
<allowPreemptionFrom>false</allowPreemptionFrom>
<schedulingPolicy>drf</schedulingPolicy>
</queue>
<queue name="hueuser" type="parent">
<weight>30.0</weight>
<fairSharePreemptionTimeout>60</fairSharePreemptionTimeout>
<fairSharePreemptionThreshold>0.5</fairSharePreemptionThreshold>
<schedulingPolicy>drf</schedulingPolicy>
</queue>
</queue>
<defaultQueueSchedulingPolicy>drf</defaultQueueSchedulingPolicy>
<queuePlacementPolicy>
<rule name="specified" create="true"/>
<rule name="nestedUserQueue">
<rule name="primaryGroup" create="true"/>
</rule>
<rule name="default"/>
</queuePlacementPolicy>
</allocations>
用户组的方式进行队列分配时,yarn的实现是在linux账号体系下去拿该用户对应的组。而默认你在hue中新建的账号在hive的linux机器上没有对应的用户,所以上述配置在分组时,会异常,从而导致用户无法在hue中做hive查询。
所以后面添加新的hue用户的流程是
adduser tom
usermod -g hueuser tom
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://www.cnblogs.com/niceshot/p/15551866.html
内容来源于网络,如有侵权,请联系作者删除!