搭建好hadoop的分布式文件系统(HDFS), 在HDFS上存储数据,将数据进行切块,分布在不同的数据节点进行存储。这些解决了存储问题,下面开始来解决将这些节点上存储的数据文件来做计算。
谷歌发表的一篇论文《GFS》,Nutch团队对这个论文使用Java进行了实现,命名为NDFS,也就是后来的HDFS。谷歌还发表过另一篇论文《MapReduce》, 介绍的就是如何解决分布式文件系统上存储的数据进行计算的问题.也就是一个分布式计算的框架。
需要计算的文件分布在不同节点上,在进行数据计算的时候民有两种方式:
将数据移动到一个节点上,在这个节点上进行数据的计算。
将计算程序分发到每一个数据节点,在每一个节点计算自己的数据。
Hadoop使用第二种计算方式,也就是将计算程序分发到不同的数据节点进行计算。Hadoop官方案例就是分布式的计算程序。而为每个计算任务分配计算资源(内存,CPU),如何协调第一个节点上的计算任务,如何监控每一个节点上的计算任务等。而这些,都由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.2 MapReduce 1.x执行流程
1.提交作业
编写MapReduce程序代码,创建Job对象,并进行配置,比如输入和输出路径,压缩格式等,然后通过JobClient来提交作业.
2.初始化作业
客户端提交完成后,JobTracker会将作业加入队列,然后进行调度,默认的调度方法是FIFO调试方式。
3.分配任务
TaskTracker和JobTracker之间的通信与任务的分配是通过心跳机制完成的。
4.执行任务
申请到任务后,TaskTracker会作如下事情:
拷贝代码到本地
拷贝任务的信息到本地
启动JVM运行任务
5.状态与任务的更新
任务在运行过程中,首先会将自己的状态汇报给TaskTracker,然后由TaskTracker汇总告之JobTracker。任务进度是通过计数器来实现的。
6.作业的完成
JobTracker是在接受到最后一个任务运行完成后,才会将任务标记为成功。此时会做删除中间结果等善后处理工作。
1.2 YARN的介绍
为克服Hadoop 1.0中的HDFS和MapReduce存在的各种问题而提出的,针对Hadoop 1.0中的MapReduce在扩展性和多框架支持方面的不足,提出了全新的资源管理框架YARM。注意: 还有一层应用是运行在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属于Hadoop的核心组件,不需要单独安装,只需要修改一些配置文件件即可。
mapreduce.framework.name
yarn
yarn.app.mapreduce.am.env
HADOOP_MAPRED_HOME=/usr/local/hadoop-3.3.1
mapreduce.map.env
HADOOP_MAPRED_HOME=/usr/local/hadoop-3.3.1
mapreduce.reduce.env
HADOOP_MAPRED_HOME=/usr/local/hadoop-3.3.1
yarn.resourcemanager.hostname
hadoopmaster
yarn.nodemanager.aux-services
mapreduce_shuffle
#添加如下:
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
cd $HADOOP_HOME/etc/
scp -r hadoop hadoopnode1:$PWD
scp -r hadoop hadoopnode2:$PWD
描叙 | 命令 |
---|---|
开启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 |
单点开启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.resourcemanager.webapp.address
0.0.0.0:8088
当开启所有的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值里,如下
yarn.application.classpath
/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/*
将这段内容编辑进 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
此时就需要开启Hadoop的历史日志服务了,Hadoop会将MapReduce的任务日志在HDFS也保留一份,我们可以通过Hadoop的历史任务服务来查看到之前的历史日志!
但是每一个程序会被分布在不同的节点上进行运行,我们在进行任务查看的时候还得一个个的指定节点进行查看,并一个个的找MapTask或者ReduceTask的日志, 很麻烦!预设Yarn提供了历史日志聚合的服务!
顾名思义,就是将每一个程序的历史日志都聚合在一起,存储在HDFS上,方便查看!
记录MapReduce的历史日志的,接下来从配置开始,到日志聚合,运行任务。
1.配置文件
mapred-site.xml
mapreduce.jobhistory.address
hadoopmaster:10020
mapreduce.jobhistory.webapp.address
hadoopmaster:19888
yarn-site.xml
yarn.log-aggregation-enable
true
yarn.log.server.url
http://hadoopmaster:19888/jobhistory/logs
yarn.log-aggregation.retain-seconds
604800
2.分发配置
[~]# pwd
/usr/local/hadoop-3.3.1/etc/hadoop
[~]# scp mapred-site.xml yarn-site.xml hadoopnode1:$PWD
[~]# scp mapred-site.xml yarn-site.xml hadoopnode2:$PWD
3. 开启历史服务
#重启yarn集群
[~]# stop-yarn.sh
[~]# start-yarn.sh
#打开历史服务
[~]# mapred --daemon start historyserver
#开启之后,通过jps可以查看到 JobHistoryServer 进程,表示开启成功
在MR程序运行时,有五个独立的进程:
YarnRunner:用于提交作业的客户端程序
ResourceManager: yarn资源管理器,负责协调集群上计算机资源的分配
NodeManager: yarn节点管理器,负责启动和监视集群中机器上的计算容器(container)
Application Master: 负责协调运行MapReduce作业的任务,他和任务都在容器中运行,这些容器由资源管理分配并由节点管理器进行管理。
HDFS: 用于共享作业所需文件。
1. 调用waitForCompletion方法每秒轮询作业的进度,内部封装了submit()方法,用于创建JobCommiter实例,并且调用其的submitJobInternal方法。提交成功后,如果有状态改变,就会把进度报告到控制台。错误也会报告到控制台
2. JobCommiter实例会向ResourceManager申请一个新应用ID,用于MapReduce作业ID。这期间JobCommiter也会进行检查输出路径的情况,以及计算输入分片。
3. 如果成功申请到ID,就会将运行作业所需要的资源(包括作业jar文件,配置文件和计算所得的输入分片元数据文件)上传到一个用ID命名的目录下的HDFS上。此时副本个数默认是10.
4. 准备工作已经做好,再通知ResourceManager调用submitApplication方法提交作业。
5. ResourceManager调用submitApplication方法后,会通知Yarn调度器(Scheduler),调度器分配一个容器,在节点管理器的管理下在容器中启动 application master进程。
6. application master的主类是MRAppMaster,其主要作用是初始化任务,并接受来自任务的进度和完成报告。
7. 然后从HDFS上接受资源,主要是split。然后为每一个split创建MapTask以及参数指定的ReduceTask,任务ID在此时分配
8. 然后Application Master会向资源管理器请求容器,首先为MapTask申请容器,然后再为ReduceTask申请容器。(5%)
9. 一旦ResourceManager中的调度器(Scheduler),为Task分配了一个特定节点上的容器,Application Master就会与NodeManager进行通信来启动容器。
10. 运行任务是由YarnChild来执行的,运行任务前,先将资源本地化(jar文件,配置文件,缓存文件)
11. 然后开始运行MapTask或ReduceTask。
12. 当收到最后一个任务已经完成的通知后,application master会把作业状态设置为success。然后Job轮询时,知道成功完成,就会通知客户端,并把统计信息输出到控制台
————————————————
本文系转载,版权归原作者所有,如若侵权请联系我们进行删除!
《数据资产管理白皮书》下载地址:
《行业指标体系白皮书》下载地址:
《数据治理行业实践白皮书》下载地址:
《数栈V6.0产品白皮书》下载地址:
想了解或咨询更多有关袋鼠云大数据产品、行业解决方案、客户案例的朋友,浏览袋鼠云官网:
同时,欢迎对大数据开源项目有兴趣的同学加入「袋鼠云开源框架钉钉技术群」,交流最新开源技术信息,群号码:30537511,项目地址: