![](/img/trans.png)
[英]Hadoop - Creating a single instance of a class for each map() functions inside the Mapper for a particular node
[英]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.