我在某处读到,如果在创建Mapper / Reducer时定义输出可写内容,则可能会提高性能,而在Mapper / Reducer中,我们应该仅设置该可写内容的值,而不是为每个输出记录创建可写内容。

例如(用伪代码):

IntWritable idWritable = new IntWritable();

map(){
     idWritable.setValue(outputValue);
     emit(idWritable);
}

优于:
map(){
     IntWritable idWritable = new IntWritable(outputValue);
     emit(idWritable);
}

这是真的?在创建将用于所有输出记录的Mapper / Reducer时,定义输出可写是否真的是一个好习惯?

最佳答案

是的,这是真的。在第二个示例中,每次处理记录时,您都将创建一个全新的IntWritable。这需要新内存分配的开销,也意味着必须在某个时候对旧的IntWritable进行垃圾回收。如果您要处理数百万条记录并使用复杂的Writable(例如,几个intsStrings),则可以非常快地填充堆。

或者,只需重新设置同一对象内的值,就不需要分配新的内存,也不需要进行垃圾回收。它的速度要快得多,但是我建议您做一些实验来确认这一点。

08-25 04:23