这是一个关于map reduce步骤中可写变量的性能和分配的问题。这是一个减速机:
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权威指南中,所有示例都是第一种形式,但我不确定这是针对较短的代码示例,还是因为它更惯用。
2条答案
按热度按时间ikfrs5lh1#
这本书可以使用第一种形式,因为它更简洁。然而,它的效率较低。对于大型输入文件,这种方法将创建大量对象。这种过度的对象创建会降低性能。就性能而言,第二种方法更可取。
讨论这个问题的一些参考文献:
提示7:,
关于hadoop对象重用,以及
这是吉拉。
dgiusagp2#
是的,如果reducer有大量数据要处理,第二种方法更可取。第一种方法,将继续创建引用并根据垃圾收集器清除它。