Hadoop:什么时候在reducer中调用setup方法?

时间:2014-12-08 18:49:29

标签: hadoop distributed-cache reducers

据我了解,reduce任务有三个阶段。

随机播放,排序和实际减少调用。

所以通常在hadoop工作的输出中我们会看到类似的东西, 地图0%减少0% 地图20%减少0% 。 。 。 地图90%降低10% 。 。

因此我假设reduce任务在所有映射完成之前启动,并且此行为由慢启动配置控制。

现在我还不知道什么时候实际调用reducer的setup方法。

在我的用例中,我在setup方法中解析了一些文件。该文件大小约为60MB,并从分布式缓存中获取。在解析文件时,配置中还有另一组数据可以更新刚刚解析的记录。在解析和可能的更新之后,文件存储在HashMap中以便快速查找。所以我希望尽快调用这个方法,可能是当映射器仍在做它们的事情时。

有可能这样做吗?或者那已经发生了什么?

由于

2 个答案:

答案 0 :(得分:1)

Setup能够从流中读取第一个键/值对之前调用它。

在所有映射器运行并且给定的reducer分区的所有合并完成后,这是有效的。

答案 1 :(得分:0)

正如Hadoop docs中所述,setup()方法在任务开始时被调用一次。它应该用于实例化资源/变量或读取可配置的参数,而这些参数又可以在reduce()方法中使用。把它想象成一个构造函数。

以下是reducer的示例:

class ExampleReducer extends TableReducer<ImmutableBytesWritable, ImmutableBytesWritable, ImmutableBytesWritable> {

    private int runId;
    private ObjectMapper objectMapper;

    @Override
    protected void setup(Context context) throws IOException {
        Configuration conf = context.getConfiguration();
        this.runId = Integer.valueOf(conf.get("stackoverflow_run_id"));
        this.objectMapper = new ObjectMapper();
    }


    @Override
    protected void reduce(ImmutableBytesWritable keyFromMap, Iterable<ImmutableBytesWritable> valuesFromMap, Context context) throws IOException, InterruptedException {
        // your code
        var = objectMapper.writeValueAsString();
        // your code
        context.write(new ImmutableBytesWritable(somekey.getBytes()), put);
    }
}