接上篇,hdfs集群启动后仅仅是一个分布式文件系统而已,并不具备计算的能力,因此引出yarn,记录一下yarn HA的搭建过程。
首先需要注意一点,Yarn与HDFS属于两个不同的集群,一个负责文件存储,一个负责作业调度,二者之间没有必然关系,也不一定说Yarn的某些节点必须必须要放在datanaode
上。通常会把nodemanager
和datanode
放在一起是因为要“计算向数据移动”,尽可能使计算作业就在存储节点上执行。
hadoop-env.sh
由于hadoop3限制必须要声明角色运行进程,在文件末尾加上以下两行:
export YARN_NODEMANAGER_USER="root"
export YARN_RESOURCEMANAGER_USER="root"
mapred-site.xml
<!-- 指定mr框架 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 这一段必须写,不然yarn执行任务时会报
Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster -->
<property>
<name>mapreduce.application.classpath</name>
<value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value>
</property>
yarn-site.xml
<configuration>
<!-- 固定写法 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 固定写法,不写yarn会报错 -->
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
<!-- yarn的集群id -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yarncluster</value>
</property>
<!-- 启用HA -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>slave1</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>slave2</value>
</property>
<!-- webapp的地址务必要配置,不然yarn可以启动但是无法执行map任务,大坑 -->
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>slave1:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>slave2:8088</value>
</property>
<property>
<name>hadoop.zk.address</name>
<value>qlwbnew116:2181,qlwbnew117:2181,qlwbnew118:2181,qlwbnew119:2181,qlwbnew120:2181</value>
</property>
<!-- 启用自动恢复 -->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!-- 持久化方式,既然启用了ZK那就把信息存储到ZK里面 -->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<!-- 自动检测硬件配置,视机器配置酌情开启,默认关闭 -->
<property>
<name>yarn.nodemanager.resource.detect-hardware-capabilities</name>
<value>true</value>
</property>
</configuration>
配置文件就这两个,随后便可以通过sbin/start-yarn.sh
来启动yarn集群了。
验证
分别访问两台机器的8088端口,应该看到一台是standby,一台是active:
值得关注的几个点:
standby
节点上,只有About
这个页面能看到本节点的信息,点击其他链接都会自动跳转到active节点;standby
节点看不到集群其他信息,比如任务数,vcpu
核数,节点数和内存容量,都会显示为0,只有active
节点上才能看到;- 页面中显示的
Cluster ID
并不是集群的id,而是当前节点在集群中的id,这里与大多数集群系统的显示有所差异,不要以为是配置文件写错了。
Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster
如果出现以下类似提示:
检查mapred-site.xml
及yarn-site.xml
中以下配置是否写全(上文给出的配置中已经包含此项):
不需要去执行hadoop classpath
!
不需要去执行hadoop classpath
!
不需要去执行hadoop classpath
!
按照文档上写全就好了!
failed 2 times due to AM Container for appattempt_XXXX
org.apache.hadoop.mapreduce.v2.app.MRAppMaster: Error starting MRAppMaster
这两个错误属于同一原因,yarn上看错误信息是这样:
在container日志里看是这样的:
主要原因是没有配置yarn.resourcemanager.webapp.address
,虽然这一项有默认值:
但仍然要重新声明一下,也许是个bug吧,在yarn-site.xml
里添加以下内容就可以解决:
记得重启yarn!