博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
超简单读懂mapreduce的工作过程
阅读量:3958 次
发布时间:2019-05-24

本文共 898 字,大约阅读时间需要 2 分钟。

一.Map task

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

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

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

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

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

 

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

转自  

你可能感兴趣的文章
spring实例化Bean理解
查看>>
Mac下配置JAVA_HOME
查看>>
fedora 安装mp3播放器插件
查看>>
赏心悦目的宏代码
查看>>
理解套接字recv(),send()
查看>>
发一个C++写的跨平台的BlockingQueue
查看>>
Linux TCP/IP协议栈剖析【体系结构篇】
查看>>
游戏开发中预防内存泄露的一些措施
查看>>
以前的文章全部移除了。
查看>>
几首歌
查看>>
蝴蝶泉边
查看>>
编码转换
查看>>
freerice
查看>>
Does your mother know
查看>>
《写出质量好软件的75条体会》暨答案ZT [转自monkyy的blog]
查看>>
关于详细设计
查看>>
POJ2838,Sliding Window(单调队列)
查看>>
牛客练习赛50,B tokitsukaze and Hash Table(STL+输入输出挂)
查看>>
POJ3728,The merchant(倍增LCA+分治)
查看>>
2019 ICPC Malaysia National,E. Optimal Slots(01背包变形)
查看>>