2013-03-11 87 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