在Hadoop中映射和减少类属性

时间:2014-12-02 18:22:31

标签: java hadoop parallel-processing

所以,我是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,会发生什么情况?

谢谢!

1 个答案:

答案 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()方法。

希望澄清事情。