【问题标题】:Defining one writable for whole Mapper/Reducer为整个 Mapper/Reducer 定义一个可写对象
【发布时间】:2015-11-12 18:46:32
【问题描述】:

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

例如(在伪代码中):

IntWritable idWritable = new IntWritable();

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

比:

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

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

【问题讨论】:

    标签: hadoop


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-17
      • 2018-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 2018-02-23
      • 1970-01-01
      相关资源
      最近更新 更多