目录
搭建好hadoop的分布式文件系统(HDFS), 在HDFS上存储数据,将数据进行切块,分布在不同的数据节点进行存储。这些解决了存储问题,下面开始来解决将这些节点上存储的数据文件来做计算。
谷歌发表的一篇论文《GFS》,Nutch团队对这个论文使用Java进行了实现,命名为NDFS,也就是后来的HDFS。谷歌还发表过另一篇论文《MapReduce》, 介绍的就是如何解决分布式文件系统上存储的数据进行计算的问题.也就是一个分布式计算的框架。
需要计算的文件分布在不同节点上,在进行数据计算的时候民有两种方式:
-
将数据移动到一个节点上,在这个节点上进行数据的计算。
-
将计算程序分发到每一个数据节点,在每一个节点计算自己的数据。
Hadoop使用第二种计算方式,也就是将计算程序分发到不同的数据节点进行计算。Hadoop官方案例就是分布式的计算程序。而为每个计算任务分配计算资源(内存,CPU),如何协调第一个节点上的计算任务,如何监控每一个节点上的计算任务等。而这些,都由YARN实现.
一、YARN的简介
1.1 MapReduce 1.x
第一代Hadoop,由分布式存储系统HDFS和分布式计算框架MapReduce组成。其中,HDFS由一个NameNode和多个DataNode组成,MapReduce由一个JobTracker和多个TaskTracker组成。对应Hadoop版本为Hadoop 1.x, 和0.21.x, 0.22.x。
1.1.1 MapReduce 1.x的角色
-
client: 作业提交发起者
-
JobTracker: 初始化作业,分配作业,与TaskTracker通信,协调整个作业
-
TaskTracker: 保持JobTracker通信,在分配的数据片段上执行MapReduce任务

1.1.2 MapReduce 1.x执行流程

-
提交作业
编写MapReduce程序代码,创建Job对象,并进行配置,比如输入和输出路径,压缩格式等,然后通过JobClient来提交作业.
-
初始化作业
客户端提交完成后,JobTracker会将作业加入队列,然后进行调度,默认的调度方法是FIFO调试方式。
-
分配任务
TaskTracker和JobTracker之间的通信与任务的分配是通过心跳机制完成的。
-
执行任务
申请到任务后,TaskTracker会作如下事情:
-
拷贝代码到本地
-
拷贝任务的信息到本地
-
启动JVM运行任务
-
-
状态与任务的更新
任务在运行过程中,首先会将自己的状态汇报给TaskTracker,然后由TaskTracker汇总告之JobTracker。任务进度是通过计数器来实现的。
-
作业的完成
JobTracker是在接受到最后一个任务运行完成后,才会将任务标记为成功。此时会做删除中间结果等善后处理工作。
1.2 YARN的介绍
为克服Hadoop 1.0中的HDFS和MapReduce存在的各种问题而提出的,针对Hadoop 1.0中的MapReduce在扩展性和多框架支持方面的不足,提出了全新的资源管理框架YARM。
Apache YARM(Yet another Resource Negotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于一个分布式的操作系统平台,而MapReduce等计算程序则相当于运行于操作系统之上的应用程序。
YARN被引入Hadoop 2,最初是为了改善MapReduce的实现,但是因为具有足够的通用性,同样可以支持其他的分布式计算模式,比如Spark, Tez等计算框架。

注意: 还有一层应用是运行在MapReduce, Sqark或者Tez之上的处理框架,如Pig, Hive和Crunch等.
1.3 YARN的设计思想
YARN的基本思想是将资源管理和作业调度/监视功能划分为单独蝗守护进程。其思想是拥有一个全局ResourceManager(RM), 以及每个应用程序拥有一个ApplicationMaster(AM)。应用程序可以是单个作业,也可以是一组作业。

一个ResourceManager和多个Nodemanager构成了YARM资源管理框架。他们是YARM启动后长期运行的守护进程,来提供核心服务。
ResourceManager
是在系统中的所有应用程序之间仲裁资源的最终权威,即管理整个集群上的所有资源分配,内部含有一个Scheduler(资源调度器)
NodeManager
是每台机器的资源管理器,也就是单个节点的管理者,负责启动和监视容器(container)资源使用情况,并向ResourceManager及其Scheduler报告使用情况
container
即集群上的可使用资源,包含cpu、内存、磁盘、网络等
ApplicationMaster(简称AM)
实际上是框架的特定的库,每启动一个应用程序,都会启动一个AM,它的任务是与ResourceManager协商资源,并与NodeManager一起执行和监视任务。
YARN的角色 MapReduce 1.x的角色 ResourceManager、Application Master、Timeline Server JobTracker NodeManager TaskTracker Container Slot
二 YARN的配置
YARN属于Hadoop的核心组件,不需要单独安装,只需要修改一些配置文件件即可。
1. mapred-site.xml
<!-- 指定MapReduce作业执行时,使用YARN进行资源调度 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/hadoop-3.3.1</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/hadoop-3.3.1</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/hadoop-3.3.1</value>
</property>
2. yarn-site.xml
<!-- 设置ResourceManager -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoopmaster</value>
</property>
<!--配置yarn的shuffle服务-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
3. hadoop-env.sh
#添加如下:
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
4. 分发到其他节点
cd $HADOOP_HOME/etc/
scp -r hadoop hadoopnode1:$PWD
scp -r hadoop hadoopnode2:$PWD
5.YARN的服务启停
| 描叙 | 命令 |
|---|---|
| 开启YARN全部服务 | start-yarn.sh |
| 停止YARN全部服务 | stop-yarn.sh |
| 单点开启YARN相关进程 | yarn --daemon start resourcemanager yarn --daemon start nodemanager |
| 单点关闭YARN相关进程 | yarn --daemon stop resourcemanager yarn --daemon stop nodemanager |
验证:http://192.168.68.128:8088/cluster

如果此页面启动不起来,需在yarn-site.xml里添加:
<!--然后在yarn-site.xml添加配置: -->
<!--yarnweb http通讯地址-->
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>0.0.0.0:8088</value>
</property>
详见:hadoop yarn 历史服务器 web无法访问_yarn webui无法访问历史服务器-CSDN博客
6. 任务测试
当开启所有的YARN的进程之后,我们再次运行之前的Hadoop官方案例:wordcount
hadoop jar /usr/local/hadoop-3.3.1/share/hadoop//mapreduce/hadoop-mapreduce-examples-3.3.1.jar wordcount /newInput /output2
hadoop jar /usr/local/hadoop-3.3.1/share/hadoop//mapreduce/hadoop-mapreduce-examples-3.3.1.jar pi 10 10
1.错误处理
错误: 找不到或无法加载主类 org.apache.hadoop.mapred.YarnChild
在命令窗口输入下面命令
hadoop classpath
将显示出来的路径添加到 "yarn.application.classpath"的Value值里,如下
<property>
<name>yarn.application.classpath</name>
<value>
/usr/local/hadoop-3.3.1/etc/hadoop,
/usr/local/hadoop-3.3.1/share/hadoop/common/lib/*,
/usr/local/hadoop-3.3.1/share/hadoop/common/*,
/usr/local/hadoop-3.3.1/share/hadoop/hdfs,
/usr/local/hadoop-3.3.1/share/hadoop/hdfs/lib/*,
/usr/local/hadoop-3.3.1/share/hadoop/hdfs/*,
/usr/local/hadoop-3.3.1/share/hadoop/mapreduce/*,
/usr/local/hadoop-3.3.1/share/hadoop/yarn,
/usr/local/hadoop-3.3.1/share/hadoop/yarn/lib/*,
/usr/local/hadoop-3.3.1/share/hadoop/yarn/*
</value>
</property>
将这段内容编辑进 yarn-site.xml里面,并重启yarn.
2 错误:
INFO conf.Configuration: resource-types.xml not found INFO resource.ResourceUtils: Unable to find 'resource-types.xml'.
参见:Apache Hadoop 3.0.0 – Hadoop: YARN Resource Configuration
hadoop jar /usr/local/hadoop-3.3.1/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar pi 10 10
三 YARN的历史日志
1. 历史日志概述
当在YARN上运行MapReduce的程序的时候,可以在控制台上看到任务的日志输出,以获取到任务的运行状态。同时,YARN也会将日志写在本地的$HADOOP_HOME/logs/userlogs文件夹中,我们可以到文件夹中进行日志的查看,但是这个文件夹中的内容,会随意YARN的重启而被删除掉,那么此时我们将如何查看日志?
此时就需要开启Hadoop的历史日志服务了,Hadoop会将MapReduce的任务日志在HDFS也保留一份,我们可以通过Hadoop的历史任务服务来查看到之前的历史日志!
但是每一个程序会被分布在不同的节点上进行运行,我们在进行任务查看的时候还得一个个的指定节点进行查看,并一个个的找MapTask或者ReduceTask的日志, 很麻烦!预设Yarn提供了历史日志聚合的服务!
顾名思义,就是将每一个程序的历史日志都聚合在一起,存储在HDFS上,方便查看!
2. mr-historyserver
记录MapReduce的历史日志的,接下来从配置开始,到日志聚合,运行任务。
1.配置文件
mapred-site.xml
<!-- 历史任务的内部通讯地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoopmaster:10020</value>
</property>
<!-- 历史任务的外部监听页面 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoopmaster:19888</value>
</property>
yarn-site.xml
<!-- 开启日志聚集功能 -->
<!-- 开启日志聚集功能后,将会将各个Container的日志保存在yarn.nodemanager.remote-app-log-dir的位置 -->
<!-- 默认保存在/tmp/logs-->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>
<name>yarn.log.server.url</name>



1107

被折叠的 条评论
为什么被折叠?



