2014-12-02 47 views
0

所以,我是Hadoop的新手,我对hadoop如何处理Reducer或Mapper类的实现属性有个疑问。在Hadoop中映射和减少class属性

从我的理解,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); 
      } 
     } 
    } 
} 

会发生在这种情况下怎么办?

谢谢!

回答

1

据我所知,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个Reducers可以基于您的集群容量同时运行,每个Reducer实例可以访问其自己的变量,并且每个Reducer实例实例将遍历其键的范围来处理,然后依次为每个键和值列表调用reduce()方法。

希望澄清事情。

+0

那么,如果我尝试从清理和设置阶段访问属性会发生什么?这些阶段对于整个地图来说都不是独一无二的,还是减少了? – 2014-12-05 07:21:52

+0

每个Mapper/Reducer JVM调用调用一次'setup()'和'cleanup()'方法。 MapReduce框架保证它在初始化map()''reduce()'方法调用在打开数据库连接,构建集合,打开文件有用之前调用'setup()'方法;同样''cleanup()'保证在所有关键字被调用后,由Mapper/Reducer处理值用于关闭连接。 – Ashrith 2014-12-05 07:39:36

+0

那么如果我尝试在清理中打印它,那么在reducer中修改的属性会发生什么情况? – 2014-12-05 07:45:19