2

这是一个关于 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 Definitive Guide 中,所有示例都采用第一种形式,但我不确定这是用于较短的代码示例还是因为它更符合习惯。

4

2 回答 2

1

本书可能使用第一种形式,因为它更简洁。但是,它的效率较低。对于大型输入文件,该方法将创建大量对象。这种过多的对象创建会降低您的性能。在性能方面,第二种方法更可取。

讨论此问题的一些参考资料:

于 2013-08-16T20:09:17.530 回答
0

是的,如果 reducer 需要处理大量数据,则第二种方法更可取。第一种方法将继续创建引用并清理它取决于垃圾收集器。

于 2013-08-17T08:29:47.240 回答