Map计算阶段
MapOutputBuffer
对于每一个Map,都有一个环形内存buffer用来缓存中间结果,这不仅可以缓存,而且还可以用来排序,被称为MapOutputBuffer, 设置这个buffer大小的配置是
io.sort.mb
默认值是100MB.
一般当buffer被使用到一定比例,就会将Map的中间结果往磁盘上写,这个比例的配置是:
io.sort.spill.percent
默认值是80%或者0.8.
在内存中排序缓存的过程叫做sort,而当超过上面的比例在磁盘上写入中间结果的过程称之为spill.
如果能够追踪到sort和spill的状态,就可以通过调整上面两个参数对Map进行优化。
MapOutputBuffer内部有二级索引,第一级是对partition在二级索引中的位置建立索引,第二级是对partition内部的key,value在缓存中的位置建立索引。
这两级索引所占用的内存大小在整个缓存大小的比例由一个参数来控制:
io.sort.record.percent,默认是0.05.
Merge
Map的输出结果在combine阶段,最后会将多个spill临时文件合并成一个文件
每次并行merge多少个spill文件,有一个配置参数:io.sort.factor。这个参数名称特别奇怪,很容易理解成是collect或者spill阶段的调优。
默认为100, 如果文件很多,影响到了merge阶段完成的速度,可以适当调大以减少磁盘I/O。
压缩
设置mapred.output.compress为true或者false,可以控制map的输出结果文件变为压缩或者不压缩。
同时可以指定压缩格式,用参数mapred.output.compression.codec,可选值为:
zipCodec,LzoCodec,BZip2Codec,LzmaCodec
选择压缩主要的时机是当磁盘I/O成了瓶颈,而不是CPU计算成瓶颈时。
压缩格式的选择也是在压缩时间,CPU利用率和磁盘空间三者间做平衡。
其他参数参考官方文档:
https://hadoop.apache.org/docs/r1.0.4/mapred-default.html