Hadoop中org.apache.hadoop.mapreduce.Mapper.run()函数的用途是什么?

时间:2011-09-18 06:00:40

标签: function map hadoop

Hadoop中org.apache.hadoop.mapreduce.Mapper.run()函数的用途是什么?在调用setup()之前调用map(),在clean()之后调用map()run()的文档说

  

专家用户可以覆盖此方法,以便更完整地控制Mapper的执行。

我正在寻找这个功能的实际目的。

3 个答案:

答案 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)

也许它也可以用于调试目的。然后,您可以跳过部分输入键值对(=采样)来测试您的代码。