网站宜昌,常州哪家做网站好,班级网站建设的内容,怎么做网盘搜索引擎网站MapReduce的大致流程#xff1a;
1、HDFS读取数据#xff1b;
2、按照规则进行分片#xff0c;形成若干个spilt#xff1b;
3、进行Map
4、打上分区标签#xff08;patition#xff09;
5、数据入环形缓冲区#xff08;KVbuffer#xff09;
6、原地排序#xff…
MapReduce的大致流程
1、HDFS读取数据
2、按照规则进行分片形成若干个spilt
3、进行Map
4、打上分区标签patition
5、数据入环形缓冲区KVbuffer
6、原地排序并溢写sortspill
7、combinermerge落地到磁盘
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架构设计与实现原理 》