欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Hadoop YARN的介绍

程序员文章站 2022-04-28 10:06:21
...

Apache Hadoop YARN

1.Yarn通俗介绍
Apache Hadoop YARN (Yet Another Resource Negotiator,另一种资源协调者)是一种新的 Hadoop 资源管理器,它是一个通用资源管理系统和调度平台,可为上层应用提供统一的资源管理和调度。
Yarn特点:支持多个数据计算框架,运行成本低,数据共享。
Yarn的意义:
降低了企业的硬件开销(硬件成本),降低资源浪费,运行成本低,数据共享。

Yarn的内部组成
1、ResourceManager 一个集群资源的管理者
2、NodeManager 一个节点的资源管理者
3、ApplicationMaster 一个计算任务的管理者,每个计算任务都有一个APPMaster
4、Container 容器,包含内存与cpu
Yarn提交任务的流程:
Hadoop YARN的介绍
1、client向RM提交应用程序,其中包括启动该应用的ApplicationMaster的必须信息,例如ApplicationMaster程序、启动ApplicationMaster的命令、用户程序等。
2、ResourceManager启动一个container用于运行ApplicationMaster。
3、启动中的ApplicationMaster向ResourceManager注册自己,启动成功后与RM保持心跳。
4、ApplicationMaster向ResourceManager发送请求,申请相应数目的container。
5、申请成功的container,由ApplicationMaster进行初始化。container的启动信息初始化后,AM与对应的NodeManager通信,要求NM启动container。
6、NM启动启动container。
7、container运行期间,ApplicationMaster对container进行监控。container通过RPC协议向对应的AM汇报自己的进度和状态等信息。
8、应用运行结束后,ApplicationMaster向ResourceManager注销自己,并允许属于它的container被收回。
详细流程:
Hadoop YARN的介绍
Yarn得调度器
1、FIFO Scheduler: 先进先出,谁先提交谁先执行(先来后到)。
2、Capacity Scheduler:容量调度器。以列得形式配置集群资源,每个队列可以抢占其他队列得资源。多个队列可以同时执行任务。但是一个队列内部还是FIFO
3、Fair Scheduler 公平调度器,同样以列得形式配置集群资源,每个队列可以抢占其他队列得资源。当被抢占得队列有任务时,抢占得队列奉还资源。不知指出在与奉还资源需要一段时间。

FiFo举例子
排队食堂打饭、排队买车票、医院挂号

容量调度器举例子
多窗口买火车票、多窗口排队食堂打饭、多窗口银行柜台办理业务、高速收费口

公平调度器
军人优先买车票、公交车老人坐
Capacity Scheduler(CDH默认的调度器)
Root
├── prod(生产环境) 40 %
└── dev(开发环境) 60 %
├── mapreduce 60 %的50%
└── spark 60 % 的50%

1、编辑集群内的capacity-scheduler.xml 配置文件,输入一下内容
<configuration> <property> <name>yarn.scheduler.capacity.root.queues</name> <value>prod,dev</value> </property> <property> <name>yarn.scheduler.capacity.root.dev.queues</name> <value>mapreduce,spark</value> </property> <property> <name>yarn.scheduler.capacity.root.prod.capacity</name> <value>40</value> </property> <property> <name>yarn.scheduler.capacity.root.dev.capacity</name> <value>60</value> </property> <property> <name>yarn.scheduler.capacity.root.dev.maximum-capacity</name> <value>75</value> </property> <property> <name>yarn.scheduler.capacity.root.dev.mapreduce.capacity</name> <value>50</value> </property> <property> <name>yarn.scheduler.capacity.root.dev.spark.capacity</name> <value>50</value> </property> </configuration>
2、将更新的配置分发到集群所有的节点
scp capacity-scheduler.xml node02:/PWDscpcapacityscheduler.xmlnode03:/PWD scp capacity-scheduler.xml node03:/PWD

3、重启Yarn集群
./stop-all.sh
./start-all.sh
4、验证上面创建的对列
通过mapreduce.job.queuename指定对列的名字
mapreduce.job.queuename=mapreduce

hadoop jar …/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.14.0.jar pi -D mapreduce.job.queuename=mapreduce 10 10

补充说明

<!—未指定对列   默认提交default队列,该对列名字为用户名  -->
<property>
	<name>yarn.scheduler.fair.user-as-default-queue</name>
	<value>true</value>
</property>

<!-- 如果提交一个任务没有到任何的队列,是否允许创建一个新的队列,默认是true-->
<property>
	<name>yarn.scheduler.fair.allow-undeclared-pools</name>
	<value>true</value>
</property>

Hadoop YARN的介绍
公平调度器
1、修改yarn-site.xml配置文件添加以下配置

<!--  指定使用fairScheduler的调度方式  -->
<property>
	<name>yarn.resourcemanager.scheduler.class</name>
	<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
</property>

<!--  指定配置文件路径  -->
<property>
	<name>yarn.scheduler.fair.allocation.file</name>
	<value>/export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/fair-scheduler.xml</value>
</property>

<!-- 是否启用资源抢占,如果启用,那么当该队列资源使用
yarn.scheduler.fair.preemption.cluster-utilization-threshold 这么多比例的时候,就从其他空闲队列抢占资源
  -->
<property>
	<name>yarn.scheduler.fair.preemption</name>
	<value>true</value>
</property>

<property>
	<name>yarn.scheduler.fair.preemption.cluster-utilization-threshold</name>
	<value>0.8f</value>
</property>

<!-- 默认提交到default队列  -->
<property>
	<name>yarn.scheduler.fair.user-as-default-queue</name>
	<value>true</value>
</property>

<!-- 如果提交一个任务没有到任何的队列,是否允许创建一个新的队列,设置false不允许  -->
<property>
	<name>yarn.scheduler.fair.allow-undeclared-pools</name>
	<value>false</value>
</property>

2、添加fair-scheduler.xml配置文件

<?xml version="1.0"?>
<allocations>
<!-- users max running apps  -->
<userMaxAppsDefault>30</userMaxAppsDefault>
<!-- 定义队列  -->
<queue name="root">
	<minResources>512mb,4vcores</minResources>
	<maxResources>102400mb,100vcores</maxResources>
	<maxRunningApps>100</maxRunningApps>
	<weight>1.0</weight>
	<schedulingMode>fair</schedulingMode>
	<aclSubmitApps> </aclSubmitApps>
	<aclAdministerApps> </aclAdministerApps>

	<queue name="default">
		<minResources>512mb,4vcores</minResources>
		<maxResources>30720mb,30vcores</maxResources>
		<maxRunningApps>100</maxRunningApps>
		<schedulingMode>fair</schedulingMode>
		<weight>1.0</weight>
		<!--  所有的任务如果不指定任务队列,都提交到default队列里面来 -->
		<aclSubmitApps>*</aclSubmitApps>
	</queue>

<!-- 
weight
资源池权重

aclSubmitApps
允许提交任务的用户名和组;
格式为: 用户名 用户组

当有多个用户时候,格式为:用户名1,用户名2      用户名1所属组,用户名2所属组

aclAdministerApps
允许管理任务的用户名和组;

格式同上。
 -->
	<queue name="hadoop">
		<minResources>512mb,4vcores</minResources>
		<maxResources>20480mb,20vcores</maxResources>
		<maxRunningApps>100</maxRunningApps>
		<schedulingMode>fair</schedulingMode>
		<weight>2.0</weight>
		<aclSubmitApps>hadoop hadoop</aclSubmitApps>
		<aclAdministerApps>hadoop hadoop</aclAdministerApps>
	</queue>

	<queue name="develop">
		<minResources>512mb,4vcores</minResources>
		<maxResources>20480mb,20vcores</maxResources>
		<maxRunningApps>100</maxRunningApps>
		<schedulingMode>fair</schedulingMode>
		<weight>1</weight>
		<aclSubmitApps>develop develop</aclSubmitApps>
		<aclAdministerApps>develop develop</aclAdministerApps>
	</queue>

	<queue name="test1">
		<minResources>512mb,4vcores</minResources>
		<maxResources>20480mb,20vcores</maxResources>
		<maxRunningApps>100</maxRunningApps>
		<schedulingMode>fair</schedulingMode>
		<weight>1.5</weight>
		<aclSubmitApps>test1,hadoop,develop test1</aclSubmitApps>
		<aclAdministerApps>test1 group_businessC,supergroup</aclAdministerApps>
	</queue>
</queue>
</allocations>

3、分发新添加的配置文件到集群的所有节点
scp yarn-site.xml fair-scheduler.xml node02:$PWD scp yarn-site.xml fair-scheduler.xml node03:$PWD

4、重启Yarn集群
stop-yarn.sh
start-yarn.sh

5、验证
a)添加验证需要的用户(在队列内配置的)
useradd hadoop
passwd hadoop
添加组
groupadd supergroup
对应用户与组的关系(supergroup)
usermod -a -G supergroup hadoop usermod -a -G supergroup test1 usermod -a -G supergroup develop
刷新HDFS上的组
su - root -s /bin/bash -c “hdfs dfsadmin -refreshUserToGroupsMappings”
b)提交任务,查看浏览器验证
Su test1
hadoop jar …/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.14.0.jar pi 10 10
Hadoop YARN的介绍

相关标签: YARN