Hadoop 为整个映射器/还原器定义一个可写

Hadoop 为整个映射器/还原器定义一个可写,hadoop,Hadoop,我在某个地方读到,如果我们在创建Mapper/Reducer时定义输出可写项,那么性能可能会有所提高,并且在Mapper/Reducer中,我们应该只设置该可写项的值,而不是为每个输出记录创建可写项 例如(在伪代码中): 比以下各项更为理想: map(){ IntWritable idWritable = new IntWritable(outputValue); emit(idWritable); } 这是真的吗?在创建将用于所有输出记录的映射器/减速机时,定义输出可写是

我在某个地方读到,如果我们在创建Mapper/Reducer时定义输出可写项,那么性能可能会有所提高,并且在Mapper/Reducer中,我们应该只设置该可写项的值,而不是为每个输出记录创建可写项

例如(在伪代码中):

比以下各项更为理想:

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

这是真的吗?在创建将用于所有输出记录的映射器/减速机时,定义输出可写是否真的是一种好的做法?

是的。在第二个示例中,每次处理记录时,都会创建一个全新的
intwriteable
。这需要新内存分配的开销,也意味着旧的
intwriteable
必须在某个时候进行垃圾收集。如果您正在处理数百万条记录,并且使用一个复杂的
可写
(例如使用多个
整数和
字符串
),堆可以很快填满

或者,只需在同一对象中重新设置值,就不需要分配新内存,也不需要进行垃圾收集。这要快得多,但我建议你自己做实验来证实这一点

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