MapReduce 编程 系列十一 Map阶段内部细节和调节参数
2014-10-03 23:02
302 查看
Map计算阶段
1. 如果Reduce number设置为0, Map阶段会直接将结果写入HDFS中。2. 一般情况下,map包括以下几个阶段:a. read阶段 从一个或者多个输入目录中读取输入文件,通过RecordReader,从InputSplit中解析出一个个的<key,value>。b. map阶段 执行用户编写的map函数,产生新的<key,value>c. collect阶段 OutputCollection.collect函数一般在map函数内部调用,接受新的<key,value>,然后它的内部会调用Partitioner对数据分组,最后数据<key,value,partition>会被写入缓冲区(一般是环形缓冲区)MapOutputBuffer中。d. spill阶段(包含combiner) 如果缓冲区写满到一定程度,就会进入spill阶段往本地磁盘上写临时文件。 首先会将需要spill的数据按照partition排序,每个partition的数据又按照key进行排序。 然后按照partition的增序写到本地磁盘临时output/spillN.out, N表示spill的次数。如果自定义了combiner,就在这个阶段被调用用来对数据再做一次聚集操作。e. merge阶段 将所有临时文件合并成一个文件,供reduce阶段使用。
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
相关文章推荐
- MapReduce 编程 系列十二 Reduce阶段内部细节和调节参数
- MapReduce 编程 系列十 使用HashPartitioner来调节Reducer的计算负载
- Hadoop MapReduce编程 API入门系列之自定义多种输入格式数据类型和排序多种输出格式(十一)
- MapReduce 编程 系列二 编写简单mapper
- [大牛翻译系列]Hadoop(13)MapReduce 性能调优:优化洗牌(shuffle)和排序阶段
- ASP.NET温故而知新学习系列之ASP.NET中的多线程编程—.NET下的多线程编程2.2-Thread中利用构造函数传递参数
- ASP.NET温故而知新学习系列之ASP.NET多线程编程—.NET下的多线程编程利用thread.Start()传递参数(四)
- 提高用户体验的编程细节系列内容之自动切换输入法
- MapReduce(十二): Map和Reduce阶段数据合并的处理
- mapreduce中map处理过程?参数如何解析传递给map方法?
- 使用eclipse的快捷键自动生成的map或者reduce函数的参数中:“org.apache.hadoop.mapreduce.Reducer.Context context”
- NIO入门系列之第4章:缓冲区内部细节
- .NET基础示例系列之十一:线程的参数、返回值及中止
- hadoop执行mapreduce任务,能够map,不能reduce,Shuffle阶段报错
- 【Qt编程】基于Qt的词典开发系列<十一>系统托盘的显示
- 【自动化测试技术QTP基础系列十一】---Action之间的参数传递
- 提高用户体验的编程细节系列内容之自动切换输入法
- 编程经验系列-Java学习杂谈(十一)--Spring
- ASP.NET温故而知新学习系列之ASP.NET多线程编程—.NET下的多线程编程利用thread.Start()传递参数(四)
- [MapReduce] 如何向map和reduce脚本传递参数,加载文件和目录