Hadoop 2.x - MapReduce

MapReduce 工作原理

What - MapReduce

Hadoop主要解决了两个问题,海量数据的存储和海量数据的计算。

MapReduce就是Hadoop大数据框架下的分布式计算框架,是基于Hadoop数据分析中的核心计算框架。

同时,Mapreduce是一种编程模型,是一种编程方法,抽象理论

Why - MapReduce

用简洁的方式,就能实现 TB,PB级别数据在百台,千台,万台服务器上的并行运算,程序人员并不需要关心如何处理并行计算、如何分发数据、如何处理错误,这些问题都已经由mapreduce框架来处理。

How - MapReduce

我们要学习的就是这个计算模型的运行规则。在运行一个mapreduce计算任务时候,任务过程被分为两个阶段:map阶段和reduce阶段,每个阶段都是用键值对(key/value)作为输入(input)和输出(output)。而程序员要做的就是定义好这两个阶段的函数:map函数和reduce函数。

MapReduce 优缺点

  • 优点

Mapreduce易于编程
它简单的实现一些接口,就可以完成一个分布式程序,这个程序可以分布到大量的廉价的pc机器上运行。也就是说你写一个分布式程序,跟写一个简单的串行程序是一模一样的。就是因为这个特性使的Mapreduce编程变得非常流行。
良好的扩展性
项目当你的计算资源得不到满足的时候,你可以通过简单的通过增加机器来扩展它的计算能力
高容错性
Mapreduce的设计初衷就是使程序能够部署在廉价的pc机器上,这就要求它具有很高的容错性。比如一个机器挂了,它可以把上面的计算任务转移到另一个节点上运行,不至于这个任务运行失败,而且这个过程不需要人工参与,而完全是由hadoop内部完成的。
适合PB级以上海量数据的离线处理
**

  • 缺点

不擅长实时计算
Mapreduce无法做到像Mysql那样做到毫秒或者秒级的返回结果
不擅长流式计算
流式计算的输入数据是动态的,而Mapreduce的输入数据集是静态的,不能流态变化。这是Mapreduce自身的设计特点决定了数据源必须是静态的。
不擅长DAG(有向图)计算
多个应用程序存在依赖关系,后一个应用程序的输入为前一个应用程序的输出,在这种情况下,Mapreduce并不是不能做,而是使用后每个Mapreduce作业的输出结果都会写入到磁盘,会造成大量的磁盘IO,导致性能非常低下。


MapReduce 工作流程

MapReduce整体流程图

687AB017-E637-436D-BB19-8B753EC17BCD.png

  • input file的切分成小文件,默认情况下是按照hdfs block块大小一致为128M对文件进行切分。
  • Map的数量:input file文件按照128Msplit后,有多少个数据块,就对应着有多少个Map。
  • Reduce的数量: 与Map阶段定义的Partition数量一致。

MapReduce shuffle阶段:

下图先从整体来看,other maps、 other reduces的指向,可以看出,一共有4个Map 和 3个 reduces。那么现在再细分来看,下图表示的是一个 map task 和 reduce task 以及 map 和 reduce之间的shuffle执行流程
屏幕快照 2020-03-22 下午8.05.22.png

  • map 阶段开始后,会经过用户自定义逻辑对数据进行处理。
  • 完成map端处理完的数据,会被写入到环形缓冲区(buffer in memory)。这里的环形缓冲区需要说明一下,环形缓冲区的底层实现为环形队列, 默认大小为100MB
  • 数据在写入环形缓冲区后,首先进行分区(partition), 随后对每个partition内的数据进行sort操作,这里的排序方式是按照字典排序,采用快速排序算法进行排序。
  • 当map阶段数据不断的向环形缓冲区写的过程中,环形缓冲区有一个阈值,默认为80%,当数据量达到80%后,缓冲区的数据会溢写到磁盘上(merge on disk)
  • 溢写到磁盘上后,可以想像成磁盘上存放了很多内部已经排序好,并且带有分区信息的小文件,这时候要对属于同一分区的小文件进行merge,并同时进行排序,这里的排序算法选择的是归并排序
  • 此时,每个Map端,都已经准备好了每个partition的文件。
  • 上图中,绿色箭头的指向,各个Map端,带有partition信息的文件,fetch到对应的reduce端,可以看到,红色虚线箭头 other reduces对应的磁盘文件则指向其他的两个reduce端。
  • fetch到同一reduce端的partition数据,则属于同一分区数据,这时还要进行一次merge合并排序操作,排序算法选择的是归并排序,来合并成大文件
  • 最后,reduce端的shuffle阶段完成,合并好的大文件由reduce函数进行处理,最后到output输出结果。

超超超超超超超超详细的工作流程图

MapReduce-v3.png