2013-03-11 79 views
0

mapper/reducer实例如何在永久存活的jvm中重用?Hadoop映射器/还原器重用

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

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

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

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

0

据我所知,Hadoop基于一个无共享架构,所以你的'私人集合'变量将不会在不同的映射器之间共享。所以,就像你提到的那样,不应该有任何问题 - “以前的mappers的垃圾”。

+0

将特定映射器实例重用于多个任务/作业吗? – Seth 2013-03-12 17:59:38

+1

@不,它不会(默认情况下)。每次在新的JVM中创建一个新的mapper/reducer实例。 – harpun 2013-03-12 21:07:09

+0

@Seth:正如我已经提到的 - 绝对不是默认的。 – 2013-03-17 19:14:19