Hadoop为每个映射器

时间:2016-05-31 13:27:22

标签: java hadoop static mapreduce mapper

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

然而,这意味着每次当我想调用Parser时,我都需要创建一个Parser实例。但是对于每个地图作业,此实例应该相同。所以我想知道我是否可以只将这个Parser实例化一次?

还有另外一个附加问题,为什么Mapper类总是静态的?

1 个答案:

答案 0 :(得分:3)

要确保每个Mapper有一个解析器实例,请使用mappers setup方法实例化解析器实例并使用清理方法清理。

我们申请了protobuf解析器,但是需要确保您的解析器实例是线程安全的,并且没有共享数据。 注意:每个映射器只调用一次setup和cleanup方法,因此我们可以在那里初始化私有变量。 为了阐明cricket_007在 &#34中所说的内容;在分布式计算环境中,共享变量的实例是不可能的......"

we have a practice of reusing of writable classes instead of creating new writables every time we need. we can instantiate once and re-set the writable multiple times as described by Tip 6 类似地,解析器对象也可以重复使用(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;
    }