这是关于地图缩减步骤中可写变量和分配的性能的问题。这是一个减速器:
static public class MyReducer extends Reducer<Text, Text, Text, Text> {
@Override
protected void reduce(Text key, Iterable<Text> values, Context context) {
for (Text val : values) {
context.write(key, new Text(val));
}
}
}
或者这是更好的表现方式:
static public class MyReducer extends Reducer<Text, Text, Text, Text> {
private Text myText = new Text();
@Override
protected void reduce(Text key, Iterable<Text> values, Context context) {
for (Text val : values) {
myText.set(val);
context.write(key, myText);
}
}
}
在Hadoop权威指南中,所有示例都是第一种形式,但我不确定这是用于较短的代码示例,还是因为它更具惯用性。
答案 0 :(得分:1)
这本书可能会使用第一种形式,因为它更简洁。但是效率较低。对于大型输入文件,该方法将创建大量对象。这种过多的对象创建会降低您的性能。在性能方面,第二种方法更可取。
一些讨论此问题的参考资料:
答案 1 :(得分:0)
是的,如果reducer需要处理大量数据,那么第二种方法更可取。第一种方法,将继续创建引用并清理它取决于垃圾收集器。