欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > MR的环形缓冲区(底层)

MR的环形缓冲区(底层)

2025/9/14 18:03:13 来源:https://blog.csdn.net/weixin_56130021/article/details/146072025  浏览:    关键词:MR的环形缓冲区(底层)

MapReduce的大致流程:

1、HDFS读取数据;

2、按照规则进行分片,形成若干个spilt;

3、进行Map

4、打上分区标签(patition)

5、数据入环形缓冲区(KVbuffer)

6、原地排序,并溢写(sort+spill)

7、combiner+merge,落地到磁盘

8、shuffle到reduce缓存

9、继续归并排序(mergesotr)

10、reduce

11、输出到HDFS

解剖环形缓冲区:

环形缓冲区解释:环形缓冲区分为三块,空闲区、数据区、索引区。初始位置取名叫做“赤道”,就是圆环上的白线那个位置。初始状态的时候,数据和索引都为0,所有空间都是空闲状态。

tips:这里有一个调优参数,可以设置环形缓冲区的大小:

mapreduce.task.io.sort.mb,默认100M,可以稍微设置大一些,但不要太大,因为每个spilt就128M。

个人理解:因为环形缓冲区底层是一个数组

1、首先发生溢出时,Map溢出的数据会转成byte字节,从两侧开始向中间写入,一侧写入数据,一侧写入记录的索引信息。

2、当溢出的数据量达到mapreduce.map.sort.spill.percent参数设置的比例时(默认80%,这个是调优的参数)之后,会从剩余的20%空间中选出一个新的“赤道”,后续Map的溢出数据,将从新的赤道向两侧写入,一侧写入数据,一侧写入记录的索引信息。

3、第二次写入剩余的20%同时,会将第一次写入的数据进行刷写到磁盘中,由此过程循环往复,同时完成溢入-写出的过程,且在主线程mr执行过程中,会产生多次溢写操作,每次溢写都会产生溢写文件,整个操作都在内存,形状像一个环,所以才叫环形缓冲区。

4、完整实现图

为什么要有环形缓冲区?

我们读取到文件,直接排序,然后写到HDFS里不就好了吗?为啥还要整一个环形缓冲区呢?

那从架构的角度看环形缓冲区,他这么设计有什么用呢?解决什么问题呢?

思路广的朋友应该已经反应过来了。环形缓冲区不需要重新申请新的内存,始终用的都是这个内存空间。大家知道MR是用java写的,而Java有一个最讨厌的机制就是Full GC。Full GC总是会出来捣乱,这个bug也非常隐蔽,发现了也不好处理。环形缓冲区从头到尾都在用那一个内存,不断重复利用,因此完美的规避了Full GC导致的各种问题,同时也规避了频繁申请内存引发的其他问题。

另外呢,环形缓冲区同时做了两件事情:1、排序;2、索引。在这里一次排序,将无序的数据变为有序,写磁盘的时候顺序写,读数据的时候顺序读,效率高非常多!

在这里设置索引区也是为了能够持续的处理任务。每读取一段数据,就往索引文件里也写一段,这样在排序的时候能加快速度。

更多的详细信息你可以参考《Hadoop技术内幕:深入解析MapReduce架构设计与实现原理 》

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词