[大数据]由点入面了解MapReduce

一:MR的工作原理是什么?


1.从HDFS读取的文件进行split分片,split与block的对应关系可能是多对一,默认是一对一,每一片对应一个map。

2.在经过mapper的运行后,我们得知mapper的输出是这样一个key/value对;同时执行partitioner,每一个map对数据通过hash生成不同的key进行partition,决定数据对应的reduce,默认对key hash后再以reduce task数量取模。

3.map输出数据到内存缓冲区,当达到缓冲区阈值的时候,内存缓冲区默认是100MB,溢写的比例spill.percent默认是0.8,缓冲区的数据已经达到阈值即80M时就会往磁盘中spill,spill线程在把缓冲区数据写到磁盘前,会对它进行一个二次快速排序,首先根据所属的partition排序,然后在每个partition内再按key排序。如果client设置过combine,那么现在就是使用combine的时候了。将有相同key的key/value对的value加起来,减少溢写到磁盘的数据量,combiner只应该用于那种Reduce的输入key/value与输出key/value类型完全一致,且不影响最终结果的场景,比如累加,最大值等。

4.当缓冲区的数据输出到磁盘后,可能会出现多个spill文件。然后对每个map的各个spill文件中取相同key的数据进行merge,这样保证每个map阶段输出的文件是按照key进行排序的,此时结果落在了磁盘上。因为merge是将多个溢写文件合并到一个文件,所以可能也有相同的key存在,在这个过程中如果client设置过combiner,也会使用combiner来合并相同的key。

5.reduce进程启动copy线程将数据从磁盘读取到内存缓冲区中,reduce 端可能从n个map的结果中获取数据,而这些map的执行速度不尽相同,当其中一个map运行结束时,reudce就会启动拉取,默认有5个线程从map端拉取数据。这里的缓冲区大小要比map端的更为灵活,它基于JVM的heap size设置,因为shuffle阶段reducer不运行,所以应该把绝大部分的内存都给shuffle用。当达到内存缓冲区阈值的时候启动内存到磁盘的merge生成溢写文件,这个过程中如果你设置有combiner,也是会启用的。

6.当属于该reduce的map输出都拷贝完成后,这时执行磁盘到磁盘的merge,最终输出一个整体有序的数据块。

7.然后就是Reducer执行,把结果放到HDFS上。

参考文献

http://langyu.iteye.com/blog/992916

http://blog.csdn.net/zhihaoma/article/details/42777653

猜你喜欢

转载自blog.csdn.net/cloud_xiaobai/article/details/79436980