Hadoop中org.apache.hadoop.mapreduce.Mapper.run()
函数的用途是什么?在调用setup()
之前调用map()
,在clean()
之后调用map()
。 run()
的文档说
专家用户可以覆盖此方法,以便更完整地控制Mapper的执行。
我正在寻找这个功能的实际目的。
答案 0 :(得分:10)
默认的run()
方法只接受上下文提供的每个键/值对并调用map()
方法:
public void run(Context context) throws IOException, InterruptedException {
setup(context);
while (context.nextKeyValue()) {
map(context.getCurrentKey(), context.getCurrentValue(), context);
}
cleanup(context);
}
如果你想做更多的事情......你需要覆盖它。例如,MultithreadedMapper类
答案 1 :(得分:1)
我想出了一个相当奇怪的案例来使用它。
偶尔我发现我想要一个在生成任何输出之前消耗所有输入的映射器。我在过去通过在清理功能中执行记录写入来完成它。我的map函数实际上并没有输出任何记录,只是读取输入并存储私有结构中需要的任何内容。
事实证明,除非你产生很多输出,否则这种方法很好。我能说的最好的是映射器的溢出设施在清理过程中不能运行。因此,生成的记录只会在内存中累积,如果存在太多,则会导致堆耗尽。这是我对正在发生的事情的猜测 - 可能是错误的。但我的新方法肯定会解决问题。
这种新方法是覆盖run()而不是cleanup()。我对默认run()的唯一更改是,在将最后一条记录传递给map()之后,我再次使用null键和值调用map()。这是我的map()函数的一个信号,用于继续生成其输出。在这种情况下,溢出设施仍可操作,内存使用情况仍在检查中。
答案 2 :(得分:0)
也许它也可以用于调试目的。然后,您可以跳过部分输入键值对(=采样)来测试您的代码。