安装部署
准备
1、创建安装目录
mkdir -p /e3base/e3-info/yarn/data1/local
mkdir -p /e3base/e3-info/yarn/data1/pids
mkdir -p /e3base/e3-info/yarn/data1/logs
2、YARN配置
hadoop的配置文件均处于/e3base/hadoop/etc/hadoop目录下。而对于YARN的安装部署文件也是在此目录之中,在该目录下对如下配置文件进行配置。
# 第一步,环境变量的配置
# Hadoop环境变量的配置
# hadoop
export HADOOP_HOME=$IN_HOME/hadoop
export PATH=$HADOOP_HOME/sbin:$HADOOP_HOME/bin:$PATH
# 第二步,yarn-env.sh文件配置(此处的配置与HDFS的配置一样)
export JAVA_HOME=/e3base/jdk
export HADOOP_HOME=/e3base/hadoop
export E3_INFO_HOME=/e3base/e3-info
export YARN_PID_DIR=$E3_INFO_HOME/hadoop/pids
export YARN_LOG_DIR=$E3_INFO_HOME/hadoop/logs
# 第三步,yarn-site.xml文件配置
<property>
# 高可用ZK通信地址
<name>yarn.resourcemanager.zk-address</name> <value>dchao:11001,dchao01:11001,dchao02:11001</value>
</property>
<property>
# YARN主管理节点地址
<name>yarn.resourcemanager.hostname.rm1</name>
<value>dchao01</value>
</property>
<property>
# YARN备管理节点地址
<name>yarn.resourcemanager.hostname.rm2</name>
<value>dchao02</value>
</property>
<property>
# local使用来存储
<name>yarn.nodemanager.local-dirs</name>
<value>/e3base/e3-info/yarn/local</value>
</property>
<property>
# 存储yarn上运行的日志
<name>yarn.nodemanager.log-dirs</name>
<value>/e3base/e3-info/yarn/logs</value>
</property>
<!-- cpu and memory -->
<property>
# 最小内存分配资源
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>1024</value>
</property>
<property>
# 最大分配的内存资源
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>1024</value>
</property>
<property>
# 最小预分配的CPU资源
<name>yarn.scheduler.minimum-allocation-vcores</name>
<value>1</value>
</property>
<property>
# 最大预分配的CPU资源
<name>yarn.scheduler.maximum-allocation-vcores</name>
<value>1</value>
</property>
<property>
# 注意这里是nodemanager
<name>yarn.nodemanager.resource.memory-mb</name>
<value>1024</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>1</value>
</property>
# 第四步,fair-scheduler.xml配置文件
<?xml version="1.0"?>
<allocations>
<queue name="root">
<minResources>1024 mb, 1 vcores</minResources>
<maxResources>1024 mb, 1 vcores</maxResources>
<maxRunningApps>100</maxRunningApps>
<weight>2.0</weight>
<schedulingPolicy>fair</schedulingPolicy>
<minSharePreemptionTimeout>2</minSharePreemptionTimeout>
<aclSubmitApps>e3base e3base</aclSubmitApps>
<aclAdministerApps>e3base e3base</aclAdministerApps>
<queue name="default">
<minResources>1024 mb, 1 vcores</minResources>
<maxResources>1024 mb, 1024 vcores</maxResources>
<schedulingPolicy>fair</schedulingPolicy>
<aclSubmitApps>*</aclSubmitApps>
<aclAdministerApps>*</aclAdministerApps>
</queue>
</queue>
</allocations>
注意:
1、如默认default队列的资源量与root队列资源量相等,则上述文件的红色部分的值两处是一样的<maxResources>xxx mb, yyy vcores</maxResources>。
xxx= yarn.nodemanager.resource.memory-mb* nodemanager的个数。
yyy= yarn.nodemanager.resource.cpu-vcores * nodemanager的个数。
2、default队列的资源量原则上要小于等于root队列资源量。
# 第五步,配置mapred-env.sh文件
export HADOOP_HOME=/e3base/hadoop
export E3_INFO_HOME=/e3base/e3-info
# HADOOP_MAPRED_LOG_DIR:MapReduce日志存放路径
export HADOOP_MAPRED_LOG_DIR=$E3_INFO_HOME/hadoop/logs
# 第六步,配置mapred-site.xml文件
<property>
# MapReduce运行模式
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
# jobhistory服务主机名
<name>mapreduce.jobhistory.hostname</name>
<value>dchao02</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>${mapreduce.jobhistory.hostname}:13021</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>${mapreduce.jobhistory.hostname}:13022</value>
</property>
参数说明:
1、mapreduce.framework.name: MapReduce运行模式(默认配置为yarn)
2、mapreduce.jobhistory.hostname: jobhistory服务主机名
3、mapreduce.jobhistory.address: MapReduce JobHistory Server通信地址,地址形式为 主机地址:端口。
4、mapreduce.jobhistory.webapp.address: MapReduce JobHistory Server Web UI地址。通过web页面查看MR执行状态的地址
分发
之前配置HDFS时候,已经创建好文件夹,且安装过hadoop,先在向集群中的其他主机进行分发,只需要将修改的文件进行分发即可。
for i in dchao0{1..2};do scp -r /e3base/hadoop/etc/hadoop $i:/e3base/hadoop/etc/;done;
# 注意
1、进行分发的之后,目标机器中的地址是分发文件的上一级
2、我们想要在一个循环中分发多个文件,只能是写多个scp进行分发,不可以在一个scp中写多个文件
3、粗暴的方式,直接将多个文件的上一级文件分发过去即可
启动
大数据集群的启动,最初是的任务就是zookeeper,其次是hdfs,然后是yarn。
zookeeper启动:每台机器都需要启动,启动命令:zkServer.sh start
hdfs启动:只有在第一次的时候需要进行初始化,只进行一次。后续就不需要了。启动命令:start-dfs.sh
yarn启动:启动命令:start-yarn.sh
查看状态
在启动完之后,可以查看。所有的服务有没有启动成功。
yarn rmadmin -getServiceState rm1
yarn rmadmin -getServiceState rm2
组件理解
YARN架构
YARN主要由ResourceManager、NodeManager、ApplicationMaster和Container等组件构成,
ResourceManager
1、处理客户端请求
2、监控NodeManager
3、启动、监控ApplicationMaster
4、资源的分配与调度
NodeManager
1、管理单个结点上的资源
2、处理来自ResourceManager的命令
3、处理来自ApplicationMaster的命令
Application
1、负责数据的切分
2、为应用程序申请资源并分配给内部的任务
3、任务的监控与容错
Container
Container是YARN中资源的抽象,封装了某个结点上多维度资源(内存、CPU、网络、磁盘)
YARN工作机制
0、Mr程序提交到客户端所在的结点
1、向ResourceManager申请一个Application
2、ResourceManager返回一个资源提交路径以及application_id
3、提交任务所需的资源
4、资源提交完毕,申请运行MrAppMaster
5、ResourceManager将用户的请求,初始化成一个Task
6、Task排进FIFO调度队列,等待NodeManager领取Task
7、领取到Task的NodeManager会创建容器Container(CPU+ram)
8、下载jos资源到本地
9、Container向ResourceManager申请Map Master容器
10、NodeManager领取到任务,创建Container
11、第一次创建的Container向后续创建的Container发送程序启动脚本
12、第一次创建的Container再次向ResourceManager申请容器用来运行Reduce Task
13、第二次申请下的Container向第三次申请的Container获取相应的分区的数据
14、当程序执行完毕后,第一次申请下的Container会向ResourceManager申请注销自己
问题
在安装yarn的时候,除了配置上的一些改变,基本上没有什么问题。需要注意的地方有:
1、yarn-env.sh文件配置中,配置yarn启动的日志等记录文件
export YARN_PID_DIR=$E3_INFO_HOME/e3-info/yarn/data1/pids
export YARN_LOG_DIR=$E3_INFO_HOME/e3-info/yarn/data1/logs
注意:
在脚本中,有两个等号的地方
2、yarn-site.xml文件,注意配置文件中的目录文件写成绝对路径。以及内存、CPU资源的分配
1、注意全路径的书写
<property>
# 存储yarn上运行的日志
<name>yarn.nodemanager.log-dirs</name>
<value>/e3base/e3-info/yarn/logs</value>
</property>
2、注意内存大小的分配,单位是M
<property>
# 分配内存的大小
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>1024</value>
</property>
3、注意CPU资源的分配,理解的数字是 几核
<property>
# 分配是几核
<name>yarn.scheduler.minimum-allocation-vcores</name>
<value>1</value>
</property>
出现的问题
# 报错日志信息
2021-09-10 12:17:08,763 INFO org.apache.hadoop.service.AbstractService: Service RMActiveServices failed in state STARTED
org.apache.hadoop.service.ServiceStateException: org.apache.zookeeper.KeeperException$UnimplementedException: KeeperErrorCode = Unimplemented for /rmstore
# 分析解决
在配置文件中,存在ZKRMStateStore<的一个配置,注释掉即可