[英]Map and Reduce class Attributes in Hadoop
因此,我是Hadoop的新手,我對hadoop如何處理Reducer或Mapper類實現的屬性有疑問。
據我了解,reducer的每個實例將在不同的JVM中執行,因此它們之間沒有共享內存。 問題是,如果所有縮減器都試圖訪問它,那么Hadoop如何處理對在縮減器功能之外定義的屬性的並發訪問。 更甚者,如果我嘗試在化簡器中實例化變量,會發生什么。 根據我對並行編程的理解,如果沒有在關鍵區域或原子變量上進行此類操作,則將出現競爭狀況。
一個簡短的例子:
public class SequenceBuilderRed extends Reducer<Text, Text, Text, IntWritable>
{
private HashMap<String,myClass> myHashMap;
protected void setup(Reducer<Text,Text,Text,IntWritable>.Context context) throws IOException, Interrupted Exception
{
myHashMap=new HashMap<String,myClass>();
}
protected void reduce(Text key Iterable<Text> values, Reducer <Text,Text,Text,IntWritable>.Context context) throws IOException, InterruptedException
{
for(Text value:values)
{
if(!myHashMap.containsKey(value.toString())
{
myClass newObject = new myClass();
myHashMap.put(value.toString(),newObject);
}
}
}
}
如果存在具有相同Text作為值的不同化簡,在這種情況下會發生什么?
謝謝!
據我了解,reducer的每個實例將在不同的JVM中執行,因此它們之間沒有共享內存。
是的,基於數據位置,Mapper和Reducer的每個實例通常會在不同的機器上的不同JVM中執行。 因此,它們基於無共享架構。
問題是,如果所有縮減器都試圖訪問它,那么Hadoop如何處理對在縮減器功能之外定義的屬性的並發訪問。
Hadoop不允許在一個Mapper / Reducer類中定義的屬性在多個Mapper / Reducer JVM實例之間共享。 這意味着,如果您在Mapper / Reducer類中指定了一個變量,例如可以從示例中通過其自己的JVM訪問myHashMap
,例如,如果您的工作需要10個Reducer,則每個Reducer實例將創建自己的HashMap
。
為了進一步闡明, reduce()
方法不是並發方法,而是將在單個Reducer JVM實例中順序執行,因此您的HashMap
將不會被同時訪問。
因此,如果您的工作需要10個Reducer實例,則將它們放在一起,那么其中的10個Reducers可以根據您的集群容量同時全部運行,並且每個Reducer實例都可以訪問其自己的變量,並且每個Reducer實例都將迭代它要處理的鍵范圍,然后依次為每個鍵和值列表調用reduce()
方法。
希望能澄清一些事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.