当前位置:   article > 正文

浅显易懂入门大数据系列:二、MapReduce、YARN(超详细)_yarn-based

yarn-based


现在我们继续前面的教程,我们在上一章节已经说了,我们的Hadoop框架,主要由三大组件组成,分别为:HDFS、MapReduce、YARN,这一章节,我们来聊聊MapReduce和YARN。
首先,我们来看一下MapReduce。

一、MapReduce概念及架构

MapReduce的定义

官网给MapReduce的定义是:A YARN-based system for parallel processing of large data sets.
即MapReduce是基于YARN的用于为大数据集进行并行计算的系统。
所以,我们可以先知道,MapReduce是一个用于计算的系统,也可以称之为引擎,是基于YARN的、是并行计算的,并且是作用于大数据集的。

MapReduce的特点

根据定义,我们可以发现MapReduce有三个特点:
1、是用于计算的
此处的计算跟以往的计算可能不太一样,我们普通的计算也是完成一定的任务,而在我们的大数据平台、框架、组件里面,这里的计算,往往是用来完成 统计类 的任务。比如说,我们想统计一下宿舍楼里面,每个宿舍的书籍里面,出现了人物的图片有多少张?出现动物的图片出现了多少张?(在我们很小的时候,农村的孩子就是喜欢通过数书本的图片来玩游戏哈哈哈),最后,我们可以统计出来一共出现了多少个人物,动物等等。
2、是并行计算的
在大数据平台、框架、组件等,完成大数据量的统计,只用一台机器计算是无法计算得过来的,需要多台机器协作去计算。可以这样去理解,在不并行计算的时候,即一个宿舍一个宿舍开始数,数完一个宿舍后,另外一个宿舍再开始数,这样的话,数人物、动物等花费的时间就要很大了。而并行计算,就是很多个宿舍一起同时进行数,这样的话,就会很快了。那么可以几个宿舍同时一起数,这就是我们后面所需要接触到的内容了。
3、基于YARN的
YARN是我们的资源协调者,负责给我们的计算任务分配合理的资源,比如说每个任务需要花费多少人力,需要怎么样的人力,熟练的还是不熟练的,手脚灵活的还是不灵活的,具体后面会讲到。
4、作用于大数据集的
就好像我们后面会进行一个词频统计统计的案例,就是统计一个文本里面有多少个单词,这样一个简单的例子,如果用python、Java或者其他语言都是非常容易实现的,比用上MapReduce还要方便得多。但是如果数据量很大的时候,我们就可以用分布式计算引擎MapReduce来计算了,才能发挥出MapReduce的魅力。这也说明,也不是在什么时候都必须要用大数据框架,如果你的应用场景不用大数据技术更方便更简洁,那就可以不用大数据技术。

简单知道了MapReduce的特点之外,现在,我们来看一下MapReduce的架构。

MapReduce的架构

其实,MapReduce主要由两个部分组成,分别为Map与Reduce。根据英文意思,我们可以简单理解为两个过程,Map即映射,reduce即规约、合并。咱们来看一下例子:
还是我们上面的例子,现在我们要统计一下大数据全套学习书籍里面人物出现了多少次,我们可以这样计算,先给出现有人物的页面打上一个1的标签,1页里面出现了2次,就打上两个1,分别对应上我们的人物,这个打标签的过程就是Map过程,如下图所示。最后,我们统计,只需要统计这个标签的数量,就是我们的人物数量了。最后进行多个宿舍汇总的时候这个过程,就是Reduce过程,这个时候会进行几个宿舍通讯,就好像我们多台服务器,服务器之间会进行网络通讯,你会告诉别人你宿舍里有一共有多少个人物、多少个动物。最后是汇集到哪里,比如说汇集到班长、团支书那,最后由班长、团支书通讯汇报给宿管阿姨。(以后有时间再换个合适点的案例)
在这里插入图片描述
MapReduce还有一个特点,我们在每次统计的过程中,每执行完一次MapReduce,都会将记录结果进行抄在本子上,相当于服务器层面上的磁盘读写、落盘。因为我们的统计结果,往往比较复杂,不只是简单的统计动物、任务的数量,可能要经过几次MapReduce过程才能转化过来。

接下来我们开始将
在开始讲YARN之前,我们有必要来了解一下hadoop1.x的相关架构,有利于我们理解后面的内容。
在hadoop1.x的时候,其实是还没有YARN框架的,YARN的很多功能在hadoop1.x版本里都是集成在MapReduce里面的。

二、YARN的背景及架构

产生YARN的背景

1、在hadoop1.x的时候,资源调度任务交由MapReduce来执行,致使得MapReduce负载过重,任务量开销太大,性能降低,影响系统扩展性。
2、在hadoop1.x的时候,如果有比MapReduce更优秀的计算引擎出现,那Hadoop开源项目就没什么作为了,不利于支持其他更加优秀的框架。

所以,Hadoop就将MapReduce里的资源调度功能划分开来了,以达到减轻MapReduce的负担,并且,可以支持Spark等框架,将Spark作业也可以跑到YARN上面。

YARN的架构

前面我们已经说过,我们可以给每个宿舍分配多少的人力、还有分配怎样的人力,而YARN也类似。我们在分配的时候,我们主要以一个单位的形式分配,在YARN组件里面,我们称之为Container,即容器。与我们的泥水工类似,我们去承包一个工程,一般,在衡量工程工作量的时候,我们会以一组工人的形式,往往一组里面包含两个人,一个大工,一个小工,我们暂且这样比喻。大工主要起到指导的作用,小工没有决策权,只需要动手就行了。跟我们Container类似,Container里面其实主要就是包含了CPU和内存,暂且这样联想起来容易记忆。如果工作量大,可以分配多几组人。
此外,从总的方面来看,YARN也是master/slave结构,即有主从结构。与HDFS相类似,有重要管理者,有实际干活的人,此处的干活,指实际执行作业的Container。

其节点与进程关系为:
master:ResourceManager
slave:NodeManager

三、YARN的调度流程及原理

MapReduce on YARN任务调度流程

在这里插入图片描述
上面图为在执行MapReduce作业时,YARN的原理图,现在对此图进行详细的说明:
第1步:首先,我们客户端Client发起一个作业请求,即执行我们的代码,在哪台机器执行,哪台机器就是客户端。
第2步:然后Client会向ResourceManager申请一个ApplicationID,作为我们作业的唯一标识。
第3步:标识成功后,客户端会将作业上传到HDFS,因为我们的slave在跑作业的时候,会直接从集群里面拿这个计算程序,这也是分布式计算原则的体现,尽可能移动计算而不是移动数据。在上传之前,ResourceManager还会进行一些判断,如果作业的输出路径存在,或者输入路径不存在,都会先报错。
第4步:客户端上传作业到HDFS后,Client真正提交作业给ResourceManager,ResourceManager此时,会得到此作业的很多信息,包括需要多少内存、多少个CPU等等。
第5步:Client提交作业后,ResourceManager会根据集群资源情况,去找一个合适的从节点机器启动一个Container,在此Container里面启动一个ApplicationMaster进程,此进程相当于在进行计算时的master。
第6步:ApplicationMaster进程会进行一些初始化操作。
第7步:ApplicationMaster需要去查询HDFS上的作业里面有多少input splits,一个input splits会对应一个MapTask,需要知道真正执行多少个MapTask、多少个ReduceTask、这些需要计算的块分布在哪里等信息。这样,ApplicationMaster就知道了MapTask与块分布的情况,才能进一步去合理安排集群的资源。
第8步:ApplicationMaster根据上一步衡量了作业需要多少资源,应该怎么分配资源后,去向ResourceManager申请资源。
第9步:ApplicationMaster申请到资源后,会与有资源的NodeManager通信,让其启动相应的Container,在这里面会启动一个执行作业的进程,进程里面会跑Map Task与Reduce Task,即我们MapReduce的两个阶段。
第10步:执行作业的进程会去HDFS上拉去相应的作业。
第11步:拉去到作业后,执行相应的MapTask、ReduceTask。
第12步:各个Task会定期通过RPC协议向ApplicationMaster汇报自己的状态和进度,把Task的进度以及状态汇报给ApplicationMaster,以让ApplicationMaster随时掌握各个任务的运行状态。
第13步:Client会每过一定的时间去向ApplicationMaster获取Job的状态信息。

一个形象例子理解YARN流程

现在我们来讲一个比较形象的例子,现在,比如说我们的宿舍楼,现在用来当仓库了,可以存储东西的。宿舍里面依然是放了很多书,一捆一捆的,类比于我们的数据块,我们现在有个任务,需要统计宿舍里面的书里面出现的英文单词的个数,其实跟我们前面数人物、动物的例子相类似。首先,有个Client的角色,就是客户,客户就是上帝。比如说你,你向统计这些书里面英文单词的个数,首先,你先把方案书写好,是向怎么统计,统计成几份等等,方案就是你写的MapReduce作业,写好之后,去跟宿管阿姨联系,将这件事情作为一个立项。然后宿管阿姨综合考虑一下,比如说你要统计宿舍的书,首先宿舍里有书才行等等,觉得你的方案可行,就返回一个立项备号给你,确实可以这么干了。然后你将这个方案书放到这栋楼里面,即HDFS上,然后就可以正式开始实施方案了。宿管阿姨首先去一个宿舍里找到一个家伙,这个家伙就是ApplicationMaster,可以理解为班长,让班长先去认真读一下方案,比如说,方案里面是统计哪个角落的数据,有多少堆数据。班长做一下准备工作,统计衡量一下需要多少人力,然后向宿管阿姨申请,比如说需要5组员工/天工作量,那么宿管阿姨就给你分配人力,以两个人一组的形式安排,然后班长就通知其他宿舍的人干活了。每个宿舍统计的状态及结果,会不定期报告给班长,而客户呢,也就是上帝你也会不定期去询问一下统计的状态怎么样,直到全部统计完成。

在YARN的架构上会设计到几个重要的名字,这里做一个简单说明:
Client:客户,即上帝,可能是教务处主任等等
ResourceManager:即宿管阿姨
Job:实施方案书
ApplicationMaster:小组长,可以理解为班长
NodeManager:宿舍
Container:一组工人,含两个东西,CPU与内存
HDFS:存书的地方,此处是宿舍楼

四、配套教程详解

配套教程四之YARN与MapReduce的配置与使用

教程:YARN与MapReduce的配置与使用
此教程主要有两个步骤:
一、配置YARN和MapReduce的配置文件
首先,应该把YARN和MapReduce的配置文件配置好,包括,我们要给YARN分配角色,比如指定哪台机器是主角色,还有一些额外的配置项,比如说YARN统计的中间结果数据存放到哪里,然后要加上两者的关系,配置YARN跑MapReduce作业,而MapReduce也要设置成跑在YARN上。配置好后,可以启动YARN进程,然后查看默认的端口,查看YARN集群的资源情况,于HDFS的50070端口类似。
二、配置跑一个Hadoop里面内置案例
配置完成后,就可以去跑作业了。我们使用的是Hadoop里面的一个正则表达式的案例,作用是查出etc/hadoop文件夹里面包含dfs开头的文件,实际上这例子没有多大的意义,只是验证一下我们的MapReduce和YARN配置是否成功而已。

配套教程五之MapReduce实现WordCount单词计数

教程:MapReduce实现WordCount单词计数
此教程主要有两个步骤:
一、构建项目
本教程我们使用了Maven来构建项目,所以要参考:Java API实现HDFS的相关操作 里面的步骤。

在这里,顺便说一下:
1、什么是Maven?
Maven是一个项目管理工具,贯穿着整个项目开发的生命周期,我们可以用其来进行项目打包、项目测试、项目管理等等。而我们这里,简单地使用其来引入jar包、打包工程就可以了,过程也十分简单。
2、Maven有什么作用呢?
请看次教程:IntelliJ IDEA实现Hadoop读写HDFS文件(非Maven、离线版),此教程里项目没有交由Maven来进行管理。所以,我们在编程的时候,需要依赖别人的项目jar包的时候,就需要去找到相应的jar包,然后将他们引入进我们的项目里才能使用。使用Maven的好处可以简单总结成下面两个:
(1)在教程中看起来这些步骤并不难,是因为我们的教程案例简单,如果项目一复杂,我们所需要的jar就会非常多,找出来非常困难,如果是全部乱导入,一般也可以,只是,这样会造成项目臃肿无比,为后期开发留下很大隐患。
(2)如果我们以后需要升级,或者编写的代码所依赖的jar包之间有影响、冲突等等,我们处理这些版本关系就会非常复杂,解决起来有很大难度。

当然还有很多好处,在此就不一一展开了。其实IDEA编辑器自己本身也有内置了Maven工具,可以根据需要确定使用不使用,一般我们会自己额外安装一个Maven,原因是,有些时候我们修改了开源框架的源码后,需要进行编译打包,然后再使用,在此过程中,往往对Maven都是有版本要求的。Maven的安装非常简单,下载然后解压即可。

但是,我们最好完成下面教程:Maven的安装与设置 的两个配置,第一个是配置国内镜像,使下载起来更快,当然,你自己翻墙也是可以;第二个配置是配置Maven本地仓库的路径,一般windows系统会下载到C盘,填满了系统盘,对电脑不好,所以,我们自己可以额外配置一个路径。

当然,你如果不想额外安装一个Maven,可以直接去改IDEA里面内置的配置文件也是可以的。

在构建完Maven代码后,我们需要在pom.xml文件里面将相关的jar包引入到我们的项目:

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-client</artifactId>
    <version>${hadoop-version}</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5

${hadoop-version}是引用的意思,引用的是<properties>标签里面加:
<hadoop-version>2.7.5</hadoop-version>,这里的意思是将hadoop的版本号抽象出来了,以后可能有很多个<dependency>依赖都需要使用到2.7.5这个版本号,所以抽象出来,如果以后修改的话,只需要修改一个地方即可。hadoop-client里面包含了很多jar包,都是已经封装好了的,直接拿来用即刻,而不需要HDFS、MapReduce分开来一个一个引入。

在此处,我们不需要引入cloudera的仓库地址,因为我们没有使用到。

<repositories>
	<repository>
		<id>cloudera</id>
		<url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
	</repository>
</repositories>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

二、编写代码
代码的目的是用MapReduce来统计一个文件里面单词出现的次数,我们在上一章已经说过,我们的MapReduce主要分为两个步骤,Map与Reduce,其实我们在写MapReduce程序的时候,也就是去实现这两个步骤,至于怎么实现,就要根据具体的业务场景、具体的需求去实现。我们这里继承了两个类,分别为:Mapper、Reducer,最后我们在main方法里实现一个作业提交的逻辑过程与设置,提交一个job。

提交之后,我们可以进入YARN的Web UI界面去查看一下执行的流程,可以简单发现我们刚刚提交的作用已经有返回结果了,而且看到了ApplicationID。

其实我们在打完jar后,我们的工程就是一个jar包,别人的jar包也是一个工程,我们写好的代码,也一样可以给别人使用,只需要安装到相应的Maven仓库里即可使用。比如说我们现在的MapReduce,其实也可以简单地说成一个软件,一个小插件,一个小功能,这个这里实现了统计一个文本的英文出现的次数,如果以后别人不想自己实现这个功能,那么就可以直接使用你这个代码了。就好像我们引入了MapReduce的相关依赖包一样,如果我们不引入别人的东西,我们的代码远远没有这么简单。

在教程的最后,我们有一道思考题,如果我们按思路操作的话,我们是可以看到我们每台节点的进程变化,其实就是前面我们说过的MapReduce on YARN任务调度流程图里面的进程变化。

五、常见错误总结

1、未同步配置文件到slaves节点
2、配置完成后没有重启YARN集群
3、对自己集群的资源情况没有了解清楚,默认配置项可能会报错,此时需要再额外了解将一些配置加上,此时可以自己多百度一下资源。

文章总览

一、MapReduce概念及架构
MapReduce的定义
MapReduce的特点
MapReduce的架构
二、YARN的背景及架构
产生YARN的背景
YARN的架构
三、YARN的调度流程及原理
MapReduce on YARN任务调度流程
一个形象例子理解YARN流程
四、配套教程详解
配套教程四之YARN与MapReduce的配置与使用
五、常见错误总结
文章总览

后期更精彩
MapReduce的shuffle机制?
YARN的特点有哪些?
YARN是如何进行调度的?
YARN的调度方式有哪些?
如何进行YARN的队列配置等等?

因为此文章仅根据个人了解,用白话形式记录,所以难免有些地方使用描述地不够恰当,甚至也会理解错误,恳请读者们指正,谢谢!我们努力提供更加友好的资料,不误导人。如果您想要加入我们,请与我们联系,谢谢。


作者简介:邵奈一
全栈工程师、市场洞察者、专栏编辑
| 公众号 | 微信 | 微博 | CSDN | 简书 |

福利:
邵奈一的技术博客导航
邵奈一 原创不易,如转载请标明出处。


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/893053
推荐阅读
相关标签
  

闽ICP备14008679号