目录
?MapReduce中的Combine是干嘛的?有什么好出?
MapReduce的map进程和reducer进程的ivm垃圾回收器怎么选择可以提高吞吐量?
MapReduce作业执行的过程中,中间的数据会存在什么地方?不会存在内存中么?
Mapper端进行combiner之后,除了速度会提升,那从Mapper端到Reduece端的数据量会怎么变?
map输出的数据如何超出它的小文件内存之后,是落地到磁盘还是落地到HDFS中?
结合wordcount述说MapReduce,具体各个流程,map怎么做,reduce怎么做
MapReduce运行过程中会发生OOM,OOM发生的位置?
Combiner合并
1)Combiner是MR程序汇总Mapper和Reducer之外的一种组件
2)Combiner组件的父类就是Reducer
3)? Combiner和Reducer组件的区别局在于运行的位置
■ Combiner是在每一个MapTask所在的节点运行 ■ Reducer是接受全局的所有Mapper的输出结果,然后进行运算。
4)Combiner的意义就是对每一个MapTask的输出进行局部汇总,以减少网络传输量。
5)Combiner能够应用的前提是不能影响最终的业务逻辑。
自定义Combiner实现步骤:
■ 1.自定义一个Combiner并继承Reducer,重写Reduce方法 ■ 2.在Job驱动中配置使用。
环形缓冲区分为三块,空闲区、数据区、索引区。初始位置取名叫做“赤道”,就是圆环上的白线那个位置。初始状态的时候,数据和索引都为0,所有空间都是空闲状态。数据是从赤道的右边开始写入,索引(每次申请4kb)是从赤道是左边开始写,两个文件是独立的,执行期间互不干涉。
在数据和索引的大小到了mapreduce.map.sort.spill.percent参数设置的比例时(默认80%,这个是调优的参数),会有两个动作:
1、对写入的数据进行原地排序,并把排序好的数据和索引spill到磁盘上去;
2、在空闲的20%区域中,重新算一个新的赤道,然后在新赤道的右边写入数据,左边写入索引;
3、当20%写满了,但是上一次80%的数据还没写到磁盘的时候,程序就会panding一下,等80%空间腾出来之后再继续写。
如此循环往复,永不停歇,直到所有任务全部结束。整个操作都在内存,形状像一个环,所以才叫环形缓冲区。
环形缓冲区不需要重新申请新的内存,始终用的都是这个内存空间。大家知道MR是用java写的,而Java有一个最讨厌的机制就是Full GC。Full GC总是会出来捣乱,这个bug也非常隐蔽,发现了也不好处理。环形缓冲区从头到尾都在用那一个内存,不断重复利用,因此完美的规避了Full GC导致的各种问题,同时也规避了频繁申请内存引发的其他问题。
另外呢,环形缓冲区同时做了两件事情:1、排序;2、索引。在这里一次排序,将无序的数据变为有序,写磁盘的时候顺序写,读数据的时候顺序读,效率高非常多!
在这里设置索引区也是为了能够持续的处理任务。每读取一段数据,就往索引文件里也写一段,这样在排序的时候能加快速度。
?