我使用Hadoop的map reduce来解析xml文件。所以我有一个名为Parser
的类,它可以有一个方法parse()
来解析xml文件。所以我应该在Mapper的map()
函数中使用它。
然而,这意味着每次当我想调用Parser
时,我都需要创建一个Parser
实例。但是对于每个地图作业,此实例应该相同。所以我想知道我是否可以只将这个Parser
实例化一次?
还有另外一个附加问题,为什么Mapper
类总是静态的?
答案 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;
}