hadoop为每个Map器使用一个示例

iaqfqrcu  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(557)

我使用hadoop的MapReduce来解析xml文件。所以我有一门课叫 Parser 有办法的 parse() 解析xml文件。所以我应该把它用在Map绘制中 map() 功能。
但这意味着每当我想打电话给 Parser ,我需要创建一个 Parser 示例。但是对于每个Map作业,这个示例应该是相同的。所以我想知道我能不能把这个简单地说出来 Parser 就一次?
还有一个附加问题,为什么 Mapper 类总是静态的?

mbzjlibv

mbzjlibv1#

为了确保每个Map器有一个解析器示例,请使用Map器设置方法示例化解析器示例,并使用cleanup方法清除。
我们为protobuf解析器应用了相同的东西,但需要确保解析器示例是线程安全的,并且没有共享数据。注意:每个Map器只调用一次setup和cleanup方法,所以我们可以在那里初始化私有变量。为了澄清cricket\u007在“分布式计算环境中,共享变量示例是不可能的…”
我们的做法是重用可写类,而不是每次需要时都创建新的可写类。我们可以像tip6所描述的那样示例化一次并重新设置可写的多次,同样,解析器对象也可以重用(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;
    }

相关问题