超简单读懂mapreduce的工作过程

Tip:本文适合编写过mapreduce程序,但不知道它工作原理的朋友阅读,它会让你在很短时间内了解整个过程。

本文分为map端 和reduce端两张图讲解,请放大图片来看。

一.Map task

超简单读懂mapreduce的工作过程_第1张图片

1.由程序内的InputFormat(默认实现类TextInputFormat)来读取外部数据,它会调用RecordReader(它的成员变量)的read()方法来读取,返回k,v键值对。

2.读取的k,v键值对传送给map()方法,作为其入参来执行用户定义的map逻辑。

3.context.write方法被调用时,outputCollector组件会将map()方法的输出结果写入到环形缓冲区内。

4.环形缓冲区其实就是一个数组,后端不断接受数据的同时,前端数据不断被溢出,长度用完后读取的新数据再从前端开始覆盖。这个缓冲区默认大小100M,可以通过MR.SORT.MB(应该是它)配置。

5.spiller组件会从环形缓冲区溢出文件,这过程会按照定义的partitioner分区(默认是hashpartition),并且按照key.compareTo进行排序(底层主要用快排和外部排序),若有combiner也会执行combiner。spiller的不断工作,会不断溢出许多小文件。这些文件仍在map task所处机器上。

6.小文件执行merge(合并),行程分区且区内有序的大文件(归并排序,会再一次调用combiner)

7.Reduce会根据自己的分区,去所有map task中,从文件读取对应的数据。

 

二.Reduce task

超简单读懂mapreduce的工作过程_第2张图片

1.reduce task通过网络向map task获取某一分区的数据。

2.通过GroupingComparator()分辨同一组的数据,把他们发送给reduce(k,iterator)方法

- (这里多个数据合成一组时,只取其中一个key,取得是第一个)。

3.调用context.write()方法,会让OutPurFormat调用RecodeWriter的write()方法将处理结果写入到数据仓库中。写出的只有一个分区的文件数据,如图。

 

就此mapreduce的工作结束,其中map的context.write()调用后,开始聚合数据写入到reduce的过程叫做Shuffle,是mapreduce的核心所在。

你可能感兴趣的:(大数据)