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

zzzyeukh  于 2021-05-30  发布在  Hadoop
关注(0)|答案(2)|浏览(386)

据我所知,reduce任务有三个阶段。
shuffle、sort和实际reduce调用。
所以通常在hadoop作业的输出中,我们会看到类似的东西,map 0%reduce 0%map 20%reduce 0%。Map90%减少10%。
因此,我假设reduce任务在所有Map完成之前启动,并且此行为由慢启动配置控制。
现在我还不明白什么时候会调用reducer的setup方法。
在我的用例中,我有一些文件要在setup方法中解析。文件大小约为60mb,是从分布式缓存中提取的。在解析文件时,来自配置的另一组数据可以更新刚刚解析的记录。在解析和可能的更新之后,该文件存储在hashmap中,以便快速查找。所以我希望这个方法能尽快被调用,可能是在Map者还在做他们的事情的时候。
有可能这样做吗?或者这已经发生了?
谢谢

xiozqbni

xiozqbni1#

正如hadoop文档中所解释的, setup() 方法在任务开始时调用一次。它应该用于示例化资源/变量或读取可配置参数,而这些参数又可以用于 reduce() 方法。把它想象成一个构造器。
下面是一个示例:

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);
    }
}
eblbsuwk

eblbsuwk2#

Setup 在能够从流中读取第一个键/值对之前调用。
在所有Map程序运行并完成给定reducer分区的所有合并之后,这是有效的。

相关问题