我使用hadoop的MapReduce来解析xml文件。所以我有一门课叫 Parser 有办法的 parse() 解析xml文件。所以我应该把它用在Map绘制中 map() 功能。但这意味着每当我想打电话给 Parser ,我需要创建一个 Parser 示例。但是对于每个Map作业,这个示例应该是相同的。所以我想知道我能不能把这个简单地说出来 Parser 就一次?还有一个附加问题,为什么 Mapper 类总是静态的?
Parser
parse()
map()
Mapper
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; }
1条答案
按热度按时间mbzjlibv1#
为了确保每个Map器有一个解析器示例,请使用Map器设置方法示例化解析器示例,并使用cleanup方法清除。
我们为protobuf解析器应用了相同的东西,但需要确保解析器示例是线程安全的,并且没有共享数据。注意:每个Map器只调用一次setup和cleanup方法,所以我们可以在那里初始化私有变量。为了澄清cricket\u007在“分布式计算环境中,共享变量示例是不可能的…”
我们的做法是重用可写类,而不是每次需要时都创建新的可写类。我们可以像tip6所描述的那样示例化一次并重新设置可写的多次,同样,解析器对象也可以重用(tip-6样式)。如以下代码所述。例如: