簡體   English   中英

Hadoop為每個映射器使用一個實例

[英]Hadoop use one instance for each mapper

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

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

還有另外一個附加問題,為什么Mapper類總是靜態的?

要確保每個Mapper有一個解析器實例,請使用mappers setup方法實例化解析器實例並使用清理方法清理。

同樣我們申請了protobuf解析器,但是需要確保你的解析器實例是線程安全的,沒有共享數據。 注意:每個映射器只調用一次setup和cleanup方法,因此我們可以在那里初始化私有變量。 為了澄清cricket_007在“在分布式計算環境中,共享變量實例是不可能的......”中所說的內容

我們有一種重復使用可寫類的做法,而不是每次需要時創建新的可寫。 我們可以實例化一次並重復設置可寫多次,如提示6所述。同樣,解析器對象也可以重復使用(Tip-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;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM