Hadoop-MapReduce介绍

122 阅读6分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

目录

MapReduce思想

MapReduce介绍

运行MapReduce的示例

map阶段的执行流程

reduce阶段的执行流程


MapReduce思想

先分再和,分而治之

将复杂的问题,按照一定的分解方法,分为等价规模的较小的若干部分,然后逐个解决,分别找出各部分的结果,然后把各部分的结果组成整个问题的最终结果。

Map

Map是第一阶段,负责拆分,把复杂任务分别为若干个简单子任务,进行拆分的前提是这些小任务可以进行并行计算,彼此之间没有依赖关系,map的含义是映射,将分解的子任务计算为一个结果,就因为这些子问题是等价规模的,所以就像一个函数一样,子问题的子问题的计算结果就是映射关系。

Reduce

Reduce是第二阶段,负责合计,将Map阶段的结果进行汇总。

​编辑

​编辑

编程模型

  • MapReduce中定义了Map和Reduce两个接口,由用户去编程实现。
  • NaoReduce处理的数据类型不管是输入还是输出都是key:value的键值对。
  • MapReduce计算框架实现了数据存储,划分,分发,结果收集,错误恢复,分布代码执行,节点集群的自动调度等,程序员只需要关系应用层的具体计算问题。  

MapReduce介绍

一句话概括:MapReduce是一个分布式计算的计算框架

分布式计算与集中式计算相对,分布式计算是将数据分解成许多部分,然后分配给多台计算机处理,从而提高效率。集中式计算就是让全让一台计算机去处理。

MapReduce的优点

  • 易于编程:该框架隐藏了许多细节,程序员只负责实现简单的接口。
  • 良好的拓展性:当计算机资源不够时,可以通过增加机器来扩展计算能力,并不会给计算造成负担,这是它很容易去处理海量数据的关键。
  • MR在超级大量数据计算时是非常稳定的,像其它计算 框架如spark等计算速度快,但是可能不如MR稳定。

MapReduce的缺点

  • 实时计算性能差:主要用于离线作业,无法做到秒级的数据响应。
  • 不能进行流式计算:流式计算特点是源源不断得计算,并且数据是动态得,MapReduce只能针对静态数据去计算。

MapReduce的阶段

一个MapReduce编程模型只能包含一个Map阶段和Reduce阶段或者只能包含Map阶段,如果用户的业务逻辑复杂,只能进行多个阶段的处理,不能将Map的结果再交给下一个Map。

​编辑

MapReduce的数据类型

在MapReduce中,数据是以key:value的形式计算的,考虑key的value的含义是很重要的,MapReduce的排序,分组等都和K有关。 

比如统计全国订单总额,把用户编号作为key,同一个用户的订单就可以通过map聚到一起了,再求和。

MapReduce的实例进程

​编辑

MRAppMaster只有一个,另外两个可以有多个,取决于数据量

运行MapReduce的示例

官方在Hadoop安装包中给了若干示例,一个完整的MR程序需要用户编写的代码和Hadoop自己实现的代码整合在一起才可以,用户负责map和reduce两个阶段的业务问题,Hadoop负责底层的技术问题。

计算圆周率

  • 启动集群 start-all.sh
  • 1.找到示例的路径:/export/server/hadoop-3.3.0/share/hadoop/mapreduce/
  • 2.找到实例程序:hadoop-mapreduce-examples-3.3.0.jar
  • 3.提交(运行)该程序:提交到yarn集群上分布式执行,hadoop jar hadoop-mapreduce-examples-3.3.0.jar pi 2 2 或者yarn jar hadoop-mapreduce-examples-3.3.0.jar pi 2 2 ,后面的pi 2 2为参数

​编辑

统计单词个数

​编辑

Step1:可以先将需要统计的文件传到hdfs文件系统

​编辑

 Step2:找到示例路径/export/server/hadoop-3.3.0/share/hadoop/mapreduce/

 Step3:运行程序,jar hadoop-mapreduce-examples-3.3.0.jar wordcount /wordcount/4.txt /wordcount/5.txt

第一个路径是需要统计的文件路径,第二个路径是输出结果路径,注意,输出结果路径必须是不存在的文件夹,否则会报错。

​编辑

​编辑 

 

流程图

​编辑 

具体的执行过程除了map和reduce过程还有其他几个更细节的过程。

map阶段包括了splitting和mapping,将数据处理后,每个数据都为键值对的样式。

shuffle阶段将数据排序分组,把k相同的分到一组。

reduce阶段将数据的值进行累加求和。

map阶段的执行流程

​编辑

  • 阶段一:把输入目录下文件按照一定标准逐个进行逻辑分片,默认一个切片大小为一个块的大小(128M),每个片都由一个MapTask处理。
  • 阶段二:对切片中的数据按照一定规则解析返回<key,value>对,默认是按行读取,key表示第几行,value是本行的文本内容。
  • 阶段三:调用Mapper类中的map方法,以空格为分隔符,为每次读取出来的数据转换为<key,value>格式。如<apple,1>等
  • 阶段四:按照一定规则对Map输出的键值对进行分区partition,默认不分区,分区的数量是reducetask的数量,并且只有一个reducetask。
  • 阶段五:将数据写入内存缓冲区,当内存缓冲区的数据达到一定数量,达到溢出状态,根据key进行排序sort,默认根据字母顺序排序。
  • 阶段六:对所有溢出文件进行最终的merge合并到磁盘上,成为一个文件。
  • 总结:先是将数据分开处理,变成键值对,然后再合到一起并排序。

reduce阶段的执行流程

  • 阶段一:ReduceTask主动从MapTask复制拉取属于自己要处理的数据
  • 阶段二:把拉取来的数据全部进行合并,即把分散的数据合并成一个大数据,再对合并的数据进行排序,因为拉取得时候不是一下全拉过来,是分开拉取得。
  • 阶段三:对排序后的键值对调用reduce方法, 前后两个判断,判断key是否相等,如果相等就作为一组相加处理,最后把这些输出的键值对 写入HDFS文件中

shuffle过程机制

shuffle是一个过程,从map输出开始到reduce输入前结束。

shuffle本意是洗牌,混洗,将有序数据打乱成无序,而在这里,shuffle的操作更像是逆过程,将map端的无规则输出按指定的规则转换成具有一定规则的数据,以便reduce端处理。

shuffle全过程

编辑

Map端的shuffle过程

编辑

 

reduce端的shuffle过程

编辑

​编辑 ​编辑

shuffle机制弊端

MapReduce的shuffle过程是程序的核心,但是该过程频繁涉及数据在内存和磁盘之间的往复,导致计算处理慢,例如将map方法的结果先存到内存,溢出后存到磁盘,拉取时到本地,最后再存到磁盘。

MapReduce计算处理慢,很大一部分原因是shuffle处理繁琐,