执行流程
- 客户端向RM提交任务请求
- RM会在某一台NM上分配一个Container,启动AppMaster让它管理整个任务的执行
- AppMaster向MR进行注册
- AppMaster向RM申请资源,RM以Container列表的形式返回资源列表,也就是告诉AppMaster找谁要资源
- AppMaster根据资源列表分别向对应主机申请资源
- 各个NM根据Container分别开辟对应资源,并且AppMaster会将MR任务各个MapTask和ReduceTask放在这些资源中运行
- 各个MapTask和ReduceTask在运行过程中,把状态实时汇报给AppMaster
- AppMaster会将任务执行的最终状态汇报给RM
调度器
概念
调度器就是规定多个任务如何分配计算机资源
分类
- 队列调度器(FIFO Scheduler)
该调度器,会将提交的Job放入一个队列中,先进入的Job会优先得到所有资源,可能会导致某个一个Job占用大部门资源,而且执行时间较长,会影响后期job的运行,所以该调取策略一般不用
- 容量调度器(Capacity Scheduler)
1. Apache的Hadoop默认使用的就是该调度器
2. 容量调度器是将整个资源划分成多个队列,每一个队列占用一部分资源
3. 在提交任务时需要指定你要使用哪一个队列的资源,如果没有指定则使用默认队列
4. 容量调度器默认只有一个队列:default队列,如果想要建立其他队列则需要手动来设置
5. 执行任务的队列必须是叶子,也就是队列树中最末端队列
6. 给队列设置的资源占比都是资源的下限比例,默认最多可以使用%100的全部资源
手动配置调度器
#如果你想让你的Yarn集群使用某种调度器,则需要在yarn-site.xml中添加以下标签:
-- 容量调度器
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity. CapacityScheduler</value>
</property>
1、在etc/hadoop目录下备份capacity-scheduler.xml文件
cp capacity-scheduler.xml capacity-scheduler.xml_bak #备份之前的调度器配置文件
2、在node1上,设置调度器队列参数,将原来 capacity-scheduler.xml文件内容删除,添加以下内容
<?xml version="1.0"?>
<configuration>
<!-- 分为三个队列,分别为default,prod和dev -->
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>default,prod,dev</value>
</property>
<!--default队列容量为80% -->
<property>
<name>yarn.scheduler.capacity.root.default.capacity</name>
<value>80</value>
</property>
<!-- 设置prod队列10% -->
<property>
<name>yarn.scheduler.capacity.root.prod.capacity</name>
<value>10</value>
</property>
<!-- 设置dev队列10% -->
<property>
<name>yarn.scheduler.capacity.root.dev.capacity</name>
<value>10</value>
</property>
<!-- 设置dev队列可使用的资源上限为75% -->
<property>
<name>yarn.scheduler.capacity.root.dev.maximum-capacity</name>
<value>75</value>
</property>
<!-- dev继续分为两个队列,分别为eng和science -->
<property>
<name>yarn.scheduler.capacity.root.dev.queues</name>
<value>eng,science</value>
</property>
<!-- 设置eng队列50% -->
<property>
<name>yarn.scheduler.capacity.root.dev.eng.capacity</name>
<value>50</value>
</property>
<!-- 设置science队列50% -->
<property>
<name>yarn.scheduler.capacity.root.dev.science.capacity</name>
<value>50</value>
</property>
</configuration>
3、在node1上刷新队列
yarn rmadmin -refreshQueues
4、给队列提交任务进行测试
hadoop jar \
/export/server/hadoop-3.3.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar \
pi \
-Dmapreduce.job.queuename=prod \
2 10000
- 公平调度器(Fair Scheduler)
1. CDH(Cloudera Hadoop)默认就使用该调度器
2. 不管来多少job任务,都会对总资源进行平均分配