Java 在Hadoop中映射和减少类属性

Java 在Hadoop中映射和减少类属性,java,hadoop,parallel-processing,Java,Hadoop,Parallel Processing,因此,我是Hadoop的新手,我有一个关于Hadoop如何处理类缩减器或映射器实现的属性的问题 据我所知,reducer的每个实例都将在不同的JVM中执行,因此它们之间没有共享内存。问题是,如果所有的还原程序都试图访问它,Hadoop如何处理对在reducer函数外部定义的属性的并发访问。更重要的是,如果我尝试在reducer中实例化一个变量,会发生什么呢。从我对并行编程的理解来看,如果这种操作不是在一个关键区域或一个原子变量上进行的,那么就会有竞争条件 举个简单的例子: public clas

因此,我是Hadoop的新手,我有一个关于Hadoop如何处理类缩减器或映射器实现的属性的问题

据我所知,reducer的每个实例都将在不同的JVM中执行,因此它们之间没有共享内存。问题是,如果所有的还原程序都试图访问它,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);
          }
       }
     }
}
公共类SequenceBuildered扩展缩减器
{
私有HashMap-myHashMap;
受保护的无效设置(Reducer.Context上下文)引发IOException,中断异常
{
myHashMap=新HashMap();
}
受保护的void reduce(文本键Iterable值,Reducer.Context上下文)引发IOException、InterruptedException
{
用于(文本值:值)
{
如果(!myHashMap.containsKey(value.toString())
{
myClass newObject=新的myClass();
myHashMap.put(value.toString(),newObject);
}
}
}
}
在这种情况下,如果存在具有相同文本作为值的不同还原符,会发生什么情况

谢谢

据我所知,reducer的每个实例都将在不同的JVM中执行,因此它们之间没有共享内存

是的,Mapper和Reducer的每个实例都将在不同的JVM中执行,通常基于数据位置在不同的机器上执行。因此,它们基于无共享架构

问题是,如果所有的还原程序都试图访问它,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()
按顺序列出每个键和值的方法


希望这能澄清问题。

那么,如果我尝试从清理和设置阶段访问属性,会发生什么?这些阶段对于整个map或reduce不是唯一的吗?
setup()
cleanup()
方法在每次Mapper/Reducer JVM调用时都会调用一次。MapReduce框架保证调用
setup()
方法,然后初始化
map()
/
reduce()
方法调用,这些调用对于打开数据库连接、构建集合、打开文件非常有用;类似地,
cleanup()
保证在所有键之后被调用,值由映射器/Reducer处理,这对关闭连接很有用。那么,如果我尝试在清理中打印属性,在还原过程中修改的属性会发生什么情况?是的,您可以这样做;您可以在
cleanup()中的
reduce()
方法中打印正在修改的变量
如果这是您要问的。但是请记住,
cleanup()
方法只有在Reducer完成所有键、值对的处理后才被调用。我的问题是。如果每个Reducer都有自己的属性值,那么清理()之后将打印的值是什么