在hadoop2.0以前版本,资源管理和作业调度都由mapreduce完成,负载过重,性能瓶颈严重,角色不清,从2.0版引入Yarn概念,将这些只能重MR中独立出来分别用ResourceManager和ApplicationMaster进程来负责。
Yarn: 提供MapReduce、Spark程序运行,并对集群中各类资源进行管理的容器。
hadoop2.X中的Yarn 主要包括ResourceManager,ApplicationMaster和Container等。
Resourcemanager 主要职责:
处理客户端请求
启动或监控ApplicationMaster,
监控NodeManager,
资源的分配与调度
ApplicationMaster主要职责(简单理解为当执行:hadoop jar hao.jar 时,会生成一个 applicattionmaster进程用来表示当前提交的任务程序,运行结束后,自动消失)
管理MR(spark)运行程序实例
为运行实例申请资源
监控和调度运行的任务及容错
Nodemanager主要职责
管理所在机器的资源
响应来自resourcemanager,applicaionMaster的请求
Conainer主要职责
任务分发到每个nodemanager上,Yarn会为每个任务分配一个所要利用资源的一个抽象对象:称为container ,如:分配多大内存,几个核等。是对任务运行资源及环境的抽象。
配置Yarn集群安装配置:
1> 配置yarn-site.xml文件,指定resourceManger机器节点;
命令:vi /opt/mysoft/hadoop/etc/hadoop/yarn-site.xml
添加如下内容:
<property>
<!--设置每个nodemanager分配内存,默认8192m,这里配置成1540M-->
<name>yarn.nodemanager.resource.memory-mb</name>
<value>1540</value>
</property>
<property>
<!--设置每个nodemanager所使用机器上的虚拟cpu核数-->
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>1</value>
</property>
<property>
<!--指定resourcemanager服务所在机器-->
<name>yarn.resourcemanager.hostname</name>
<value>qiku</value>
</property>
<property>
<!--在nodemanager开启支持跑mapReduce程序的服务*****这个必须的*******-->
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<!--是否检查虚拟内存是否溢出,若设置为true,当运行MR程序时,只要虚拟内存溢出,就报错,程序停止运行,所以设置为false-->
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<!—是否将运行完的任务的日志及时上传到HDFS上以减轻nodemanager的负载若设置为true:还要指定对应的HDFS目录:yarn.nodemanager.remote-app-log-dir ,开发阶段,建议设置为false,默认值为:false-->
<property>
<name>yarn.log-aggregation.enabled</name>
<value>true</value>
</property>
</configuration>
2> 修改mapred-site.xml文件,指定mapreduce程序跑在Yarn上;
修改文件名:mv mapred-site.xml.template mapred-site.xml
命令:vi /opt/mysoft/hadoop/etc/hadoop/mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop:19888</value>
</property>
<property>
<name>mapreduce.jobtracher.http.address</name>
<value>hadoop:50030</value>
</property>
</configuration>
3> 在master机器上手动启动yarn服务
命令:yarn-daemon.sh start resourcemanager
在各个nodemanager上执行:
命令:yarn-daemon.sh start nodemanager
4> 脚本自动启动Yarn
命令:start-yarn.sh
(这个脚本会读取slavles文件通过SSH逐一开启nodemanager)
5> 开启任务跟踪服务
命令:mr-jobhistory-daemon.sh start historyserver
6> 通过web UI 验证是否配置成功
该服务的具体web访问端口配置在:mapred-site.xml文件中:
http://192.168.248.100:8088
http://192.168.248.100:19888
7> 把配置好的yarn-site.xml文件和mapred-site.xml文件复制到集群的各个节点机器上。
命令:scp /opt/mysoft/hadoop/etc/hadoop/yarn-site.xml hadoop1:$PWD
命令:scp /opt/mysoft/hadoop/etc/hadoop/mapred-site.xml hadoop1:$PWD
8> 重启集群服务
命令:stop-all.sh
命令:start-all.sh
Yarn集群与HDFS的关系:
1> Yarn集群是独立于HDFS的,所以可以在不启动HDFS集群的情况下直接启动Yarn集群;但往往MapReduce程序读取HDFS数据,所以往往也可开起HDFS集群;
2> Yarn和HDFS是Hadoop框架的两个重要组成部分。
生产环境中Yarn集群配置注意事项:
1: MarpReduce程序提交到Yarn 上的nodeManager节点执行计算,往往需要读取datanode里的数据,本着数据就地原则,所以在配置nodeManager节点上也配置dataNode节点,只有数据不在本地时,才考虑远端读取其它dataNode;
2: 自动化启动Yarn集群脚本,也要用到slalves文件中配置的节点信息来启动所有nodeManager节点