Hadoop MapReduce中Mapper/Reducer的设置和清理方法
是否分别在每个映射器和reducer任务中调用setup和cleanup方法?或者,它们只在整体映射器和还原器作业开始时调用一次 每个任务都会调用它们,因此如果您有20个映射器正在运行,则会为每个任务调用设置/清理 一个问题是Mapper和Reducer的标准运行方法都不能捕获map/reduce方法周围的异常,因此如果在这些方法中抛出异常,则不会调用clean-up方法Hadoop MapReduce中Mapper/Reducer的设置和清理方法,hadoop,mapreduce,Hadoop,Mapreduce,是否分别在每个映射器和reducer任务中调用setup和cleanup方法?或者,它们只在整体映射器和还原器作业开始时调用一次 每个任务都会调用它们,因此如果您有20个映射器正在运行,则会为每个任务调用设置/清理 一个问题是Mapper和Reducer的标准运行方法都不能捕获map/reduce方法周围的异常,因此如果在这些方法中抛出异常,则不会调用clean-up方法 2020编辑:如评论中所述,2012年的这句话(Hadoop 0.20)不再正确,清理被称为finally块的一部分。一个澄
2020编辑:如评论中所述,2012年的这句话(Hadoop 0.20)不再正确,清理被称为finally块的一部分。一个澄清是有帮助的。设置/清理方法用于任务级别的初始化和清理。在一个任务中,首先通过调用setup()方法进行初始化,然后完成对map()[或reduce()]函数的所有调用。在此之后,在退出任务之前,将对cleanup()方法进行另一次调用。它被称为per-Mapper任务或Reducer任务。 这是hadoop代码
public void run(Context context) throws IOException, InterruptedException {
setup(context);
try {
while (context.nextKey()) {
reduce(context.getCurrentKey(), context.getValues(), context);
}
} finally {
cleanup(context);
}
}
根据
为每个映射器和Reducer任务调用设置和清理。在Reducer上,您可以在作业中执行作业。setNumReduceTasks(1);这样,reducer的设置和清理只会运行一次。可以在map/reduce中异常的catch子句中调用cleanup方法。但是,这需要对可能的异常进行智能分析,并放入
try/catch
子句来捕获它们。One gotcha是Mapper和Reducer的标准运行方法,它不会捕获map/reduce方法周围的异常。默认的run()实现将map()和reduce()方法包装在try/finally中@NickODell-感谢更新,以后可以自由编辑答案