0

mapper/reducer 实例如何在永久保持活动状态的 jvm 中重用?

例如,假设我想做这样的事情:

public class MyMapper extends MapReduceBase implements Mapper<K1, V1, K2, V2> {

    private Set<String> set = new HashSet<String>();

    public void map(K1 k1, V1 v1, OutputCollector<K2, V2> output, Reporter reporter) {
        ... do stuff ...

        set.add(k1.toString()); //add something to a list so that it can be used later

        ... do other stuff ...


        if(set.contains("someString"))
            emitSomeKindOfOutput(output);
        else
            emitSomeOtherKindOfOutput(output);
    }

}

如果同一个映射器可用于多个任务/作业,则成员集可能会导致问题,因为它仍会包含来自先前任务/作业的其他垃圾。这种重用在hadoop中是可能的吗?减速机呢?

4

2 回答 2

2

你绝对安全。Mapper 和 reducer 实例不被重用。如果您需要执行一些初始化或清理,您可以覆盖这两个方法configure并由closeMapReduceBase 提供。您的代码示例不需要这样做。

如果set是一个静态变量,那么您必须clearclose()方法中使用它以确保安全,即使大多数站点配置都不需要(基本上默认情况下,每个地图都会派生一个新的 JVM,您必须进行配置reuse.jvm.num.tasks以启用 JVM 重用)。两个 map 任务永远不会在同一个 JVM 中同时运行。

于 2013-03-12T21:01:02.077 回答
0

据我所知,Hadoop 基于无共享架构,因此您的“私有集集”变量不会在不同的映射器之间共享。因此,正如您所提到的,不应该有任何问题 - '来自以前的映射器的垃圾'。

于 2013-03-12T14:16:59.930 回答