所以,我是Hadoop的新手,我对hadoop如何处理类Reducer或Mapper的实现属性有疑问。
根据我的理解,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);
}
}
}
}
如果存在具有相同Text的不同Reducer,会发生什么情况?
谢谢!
答案 0 :(得分:1)
根据我的理解,reducer的每个实例都将在不同的JVM中执行,然后,它们之间没有共享内存。
是的,Mapper和Reducer的每个实例都将基于数据位置在不同的机器上经常在不同的JVM中执行。因此,它们基于无共享架构。
问题是,如果所有Reducer都试图访问它,Hadoop如何处理对reducer函数之外定义的属性的并发访问。
Hadoop不允许在多个Mapper / Reducer JVM实例之间共享一个Mapper / Reducer类中定义的属性。这意味着如果您在Mapper / Reducer类中指定了一个变量,那么从您的示例myHashMap
中可以访问它自己的JVM,例如,如果您的工作需要10个Reducers,那么每个Reducer实例将创建自己的HashMap
。
为了进一步说明,reduce()
方法不是并发方法,而是在单个Reducer JVM实例中按顺序执行,因此不会同时访问HashMap
。
因此,如果您的作业需要10个Reducer实例,那么将它们组合在一起,其中10个Reducers可以根据您的群集容量同时运行,每个Reducer实例都可以访问自己的变量,以及每个Reducer实例将遍历其处理的键范围,然后按顺序为每个键和值列表调用reduce()
方法。
希望澄清事情。