我在某处读到,如果在创建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
(例如,几个ints
和Strings
),则可以非常快地填充堆。
或者,只需重新设置同一对象内的值,就不需要分配新的内存,也不需要进行垃圾回收。它的速度要快得多,但是我建议您做一些实验来确认这一点。