大数据入门:MapReduce基本原理

2020-11-24 18:11:58 浏览数 (1)

在围绕Hadoop形成的大数据技术生态当中,MapReduce的地位,在早期是处于核心地位的,但是伴随着数据处理实时性需求的不断提升,更多新的计算框架出现,MapReduce的地位受到压制,但是作为Hadoop原始计算框架,还是需要相应程度的了解和掌握的。今天的大数据入门分享,我们来具体讲一讲MapReduce基本原理。

一、什么是MapReduce?

在Hadoop技术生态当中,MapReduce是作为计算引擎出现的,在处理超大规模的数据集上,MapReduce性能可观,通过分布式计算,将大规模数据计算任务分解,分布到不同的计算节点去并行计算,从而使得低成本下的大规模数据计算成为可能。

MapReduce的原型,公认的说法,是来自Google公司2004年发布的MapReduce论文,而后Doug Cutting根据谷歌的论文,实现了MapReduce,并将其作为Hadoop的一个组件开源。在Hadoop当中,MapReduce也是处于核心组件的地位。

二、MapReduce解决了什么问题?

互联网、移动互联网的高度发达,为数据存储和数据计算都带来了新的挑战。当数据的规模大到一定程度,单独的机器已经无法负荷。那么能够怎么办呢?首先能够想到的办法,就是增加机器。

而要想让一定数量的机器实现协同工作,并且工作效率要求还不低,应该怎么去实现呢?这就是MapReduce需要解决的问题。MapReduce作为一个分布式并行计算框架,就是一个把一群机器组织起来工作的编程模型。

三、MapReduce是怎么解决的?

MapReduce,其实从运行来说,就是分为大的两个阶段的,一个阶段是MapTask(将大任务拆分为小任务),第二个阶段是ReduceTask(小任务计算结果重组),两个阶段之间,有个Shuffle的过程。

MapTask

整个MapTask分为Read阶段,Map阶段,Collect阶段,溢写(spill)阶段和combine阶段。

Read阶段:MapTask通过用户编写的RecordReader,从输入InputSplit中解析出一个个key/value;

Map阶段:该节点主要是将解析出的key/value交给用户编写map()函数处理,并产生一系列新的key/value;

Collect收集阶段:在用户编写map()函数中,当数据处理完成后,一般会调用OutputCollector.collect()输出结果。在该函数内部,它会将生成的key/value分区(调用Partitioner),并写入一个环形内存缓冲区中;

Spill阶段:即“溢写”,当环形缓冲区满后,MapReduce会将数据写到本地磁盘上,生成一个临时文件。需要注意的是,将数据写入本地磁盘之前,先要对数据进行一次本地排序,并在必要时对数据进行合并、压缩等操作;

Shuffle

Map方法之后,Reduce方法之前的数据处理过程称之为Shuffle。shuffle流程如下:

  • MapTask收集map()方法输出的kv对,放到环形缓冲区中;
  • 从环形缓冲区不断溢出到本地磁盘文件,可能会溢出多个文件;
  • 多个溢出文件会被合并成大的溢出文件;
  • 在溢出过程及合并的过程中,都要调用Partitioner进行分区和针对key进行排序;
  • ReduceTask根据自己的分区号,去各个MapTask机器上取相应的结果分区数据;
  • ReduceTask将取到的来自同一个分区不同MapTask的结果文件进行归并排序;
  • 合并成大文件后,shuffle过程也就结束了,进入reduce方法。

ReduceTask

整个ReduceTask分为Copy阶段,Merge阶段,Sort阶段(Merge和Sort可以合并为一个),Reduce阶段。

Copy阶段:ReduceTask从各个MapTask上远程拷贝一片数据,并针对某一片数据,如果其大小超过一定阈值,则写到磁盘上,否则直接放到内存中;

Merge阶段:在远程拷贝数据的同时,ReduceTask启动了两个后台线程对内存和磁盘上的文件进行合并,以防止内存使用过多或磁盘上文件过多;

Sort阶段:按照MapReduce语义,用户编写reduce()函数输入数据是按key进行聚集的一组数据。为了将key相同的数据聚在一起,Hadoop采用了基于排序的策略。由于各个MapTask已经实现对自己的处理结果进行了局部排序,因此,ReduceTask只需对所有数据进行一次归并排序即可;

Reduce阶段:reduce()函数将计算结果写到HDFS上。

关于大数据入门,MapReduce基本原理,以上就为大家做了一个简单的介绍了。在Hadoop生态当中,MapReduce虽然地位日益尴尬,但是其MapReduce思想,在后来的框架(比如Spark)当中,继续得到了继承。

0 人点赞