2016-05-31 54 views
1

我正在使用Hadoop的映射reduce來解析xml文件。所以我有一個名爲Parser的類,可以使用方法parse()來解析xml文件。所以我應該在Mapper的map()函數中使用它。Hadoop爲每個映射器使用一個實例

但是這意味着每當我想調用Parser時,我需要創建一個Parser實例。但是這個實例應該對每個地圖作業都是一樣的。所以我想知道我是否可以只將這個Parser實例化一次?

只是另一個附加問題,爲什麼Mapper類總是靜態的?

+1

在分佈式計算環境中,共享變量的情況下是不可能的...也不能肯定是否映射器總是靜態的。你在哪裏看到? –

+1

Scratch那第二種說法...我最近沒有寫mapreduce,但這裏是解釋http://stackoverflow.com/questions/11570674/why-declaring-mapper-and-reducer-classes-as-static –

+0

在這示例代碼,Mapper是靜態類。 [鏈接](https://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html) –

回答

3

爲確保每個Mapper都有一個解析器實例,請使用mappers設置方法來實例化解析器實例並使用清理方法進行清理。

同樣的事情,我們申請了protobuf解析器,但需要確保解析器實例是線程安全的,並且沒有共享數據。 注意:每個映射器只會調用一次setup和cleanup方法,所以我們可以在那裏初始化私有變量。 爲了明確所說cricket_007「在一個分佈式計算環境中,一個可變的共享情況下是不可能的。」

we have a practice of reusing of writable classes instead of creating new writables every time we need. we can instantiate once and re-set the writable multiple times as described by Tip 6 同樣解析器對象也可以被重新使用(提示-6-樣式)。如下面的代碼所述。 對於前:

private YourXMLParser xmlParser = null; 
    @Override 
     protected void setup(Context context) throws IOException, InterruptedException { 
      super.setup(context); 
      xmlParser= new YourXMLParser();   
     } 

    @Override 
     protected void cleanup(Mapper<ImmutableBytesWritable, Result, NullWritable, Put>.Context context) throws IOException, 
         InterruptedException { 
      super.cleanup(context); 
        xmlParser= null; 
    } 
相關問題