Java Hadoop为每个映射器使用一个实例

Java Hadoop为每个映射器使用一个实例,java,hadoop,static,mapreduce,mapper,Java,Hadoop,Static,Mapreduce,Mapper,我正在使用Hadoop的map reduce解析xml文件。因此,我有一个名为Parser的类,它可以有一个方法parse()来解析xml文件。所以我应该在映射器的map()函数中使用它 然而,这意味着每当我想调用解析器时,我都需要创建一个解析器实例。但是对于每个映射作业,该实例应该相同。所以我想知道我是否可以只实例化这个解析器一次 还有一个附加问题,为什么映射器类总是静态的?要确保每个映射器有一个解析器实例,请使用映射器设置方法实例化解析器实例,并使用清理方法清理 我们对protobuf解析器

我正在使用Hadoop的map reduce解析xml文件。因此,我有一个名为
Parser
的类,它可以有一个方法
parse()
来解析xml文件。所以我应该在映射器的
map()
函数中使用它

然而,这意味着每当我想调用
解析器时,我都需要创建一个
解析器
实例。但是对于每个映射作业,该实例应该相同。所以我想知道我是否可以只实例化这个
解析器一次


还有一个附加问题,为什么映射器类总是静态的?

要确保每个映射器有一个解析器实例,请使用映射器设置方法实例化解析器实例,并使用清理方法清理

我们对protobuf解析器应用了相同的东西,但需要确保您的解析器实例是线程安全的,并且没有共享数据。 注意:每个映射器只调用一次setup和cleanup方法,所以我们可以在那里初始化私有变量。
为了澄清cricket_007在中所说的话,“在分布式计算环境中,共享变量实例是不可能的……”

类似地,解析器对象也可以重用(Tip-6样式)。如以下代码所述。 例如:

private YourXMLParser xmlParser = null;
    @Override
        protected void setup(Context context) throws IOException, InterruptedException {
            super.setup(context);
            xmlParser= new YourXMLParser();        
        }

     @Override
        protected void cleanup(Mapper<ImmutableBytesWritable, Result, NullWritable, Put>.Context context) throws IOException,
                        InterruptedException {
            super.cleanup(context);
                  xmlParser= null;
    }
private YourXMLParser=null;
@凌驾
受保护的无效设置(上下文上下文)引发IOException、InterruptedException{
超级设置(上下文);
xmlParser=新的YourXMLParser();
}
@凌驾
受保护的空洞清理(Mapper.Context上下文)引发IOException,
中断异常{
super.cleanup(上下文);
xmlParser=null;
}

在分布式计算环境中,共享变量实例是不可能的。。。也不确定映射器是否始终是静态的。你在哪里看到的?擦掉第二句话。。。我最近没有写过mapreduce,但下面是这个示例代码中的解释,Mapper是静态类+1板球队。不需要是静态的(内部类除外)。上面cricket_007的链接描述了“当将mapper和reducer类声明为另一个类的内部类时,它们必须声明为静态的,这样它们就不依赖于父类。”@Yilinkg Liu:在您的示例中,您的类WordCount2也是嵌套所有其他类的驱动程序。不是吗?映射器和Reducer需要是静态的,除非它们嵌套在驱动程序中,主要是因为
main
方法是静态的。我是正确的,它们并不总是静态的,例如,您可以编写
MyMapper.java
MyReducer.java
、和
MyDriver.java
,其中不包含静态类。