map和reduce类属性

mwkjh3gx  于 2021-05-30  发布在  Hadoop
关注(0)|答案(1)|浏览(276)

所以,我是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具有相同的文本作为值,会发生什么?
谢谢!

bqujaahr

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() 方法,并按顺序列出每个键和值。
希望这能澄清问题。

相关问题