所以,我是hadoop的新手,我有一个关于hadoop如何处理类缩减器或Map器实现的属性的问题。
据我所知,reducer的每个示例都将在不同的jvm中执行,因此它们之间没有共享内存。问题是,如果所有的reducer都试图访问它,hadoop如何处理对reducer函数外部定义的属性的并发访问。更重要的是,如果我尝试在reducer中示例化一个变量会发生什么。从我对并行编程的理解来看,如果这种操作不是在一个临界区域或一个原子变量上进行的,那么就会有竞争条件。
举个简单的例子:
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);
}
}
}
}
在这种情况下,如果有不同的reducer具有相同的文本作为值,会发生什么?
谢谢!
1条答案
按热度按时间bqujaahr1#
据我所知,reducer的每个示例都将在不同的jvm中执行,因此它们之间没有共享内存。
是的,mapper和reducer的每个示例都将在不同的jvm中执行,通常基于数据位置在不同的机器上执行。因此,它们基于无共享架构。
问题是,如果所有的reducer都试图访问它,hadoop如何处理对reducer函数外部定义的属性的并发访问。
hadoop不允许在一个mapper/reducer类中定义的属性在多个mapper/reducer jvm示例之间共享。这意味着如果您在mapper/reducer类中指定了一个变量,就像您的示例中那样
myHashMap
将可以从它自己的jvm中访问,例如,如果您的作业需要10个reducer,那么每个reducer示例将创建它自己的HashMap
.为了进一步澄清,
reduce()
方法不是并发方法,而是在单个reducer jvm示例中顺序执行,因此HashMap
不会同时访问。因此,如果您的作业需要10个reducer示例,那么10个reducer可以根据集群容量同时运行,每个reducer示例都可以访问自己的变量,每个reducer示例将遍历要处理的键范围,然后调用
reduce()
方法,并按顺序列出每个键和值。希望这能澄清问题。