我正在使用Hadoop的映射reduce來解析xml文件。所以我有一個名爲Parser
的類,可以使用方法parse()
來解析xml文件。所以我應該在Mapper的map()
函數中使用它。Hadoop爲每個映射器使用一個實例
但是這意味着每當我想調用Parser
時,我需要創建一個Parser
實例。但是這個實例應該對每個地圖作業都是一樣的。所以我想知道我是否可以只將這個Parser
實例化一次?
只是另一個附加問題,爲什麼Mapper
類總是靜態的?
我正在使用Hadoop的映射reduce來解析xml文件。所以我有一個名爲Parser
的類,可以使用方法parse()
來解析xml文件。所以我應該在Mapper的map()
函數中使用它。Hadoop爲每個映射器使用一個實例
但是這意味着每當我想調用Parser
時,我需要創建一個Parser
實例。但是這個實例應該對每個地圖作業都是一樣的。所以我想知道我是否可以只將這個Parser
實例化一次?
只是另一個附加問題,爲什麼Mapper
類總是靜態的?
爲確保每個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;
}
在分佈式計算環境中,共享變量的情況下是不可能的...也不能肯定是否映射器總是靜態的。你在哪裏看到? –
Scratch那第二種說法...我最近沒有寫mapreduce,但這裏是解釋http://stackoverflow.com/questions/11570674/why-declaring-mapper-and-reducer-classes-as-static –
在這示例代碼,Mapper是靜態類。 [鏈接](https://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html) –