Hadoop映射器/减速器重复使用

时间:2013-03-11 19:38:01

标签: java hadoop mapreduce

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中这种重用是否可行?减速器怎么样?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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