为什么我们在MapReduce分布式处理概念中只有两个函数map()
和reduce()
?为什么Hadoop框架不是通用的,允许用户在初始映射函数之后进行尽可能多的函数调用?
答案 0 :(得分:2)
如果您只想对给定的 Map 输出应用不同的 Reduce 操作,我只需使用MultipleOutputs
写入不同的文件/目录,将在同一地图输出上“模拟”具有多种类型的减速器。您可以在MultipleOutputs
中应用Reducer
,可以找到更多信息here。
具有单个Map和Reduce功能的目标是可以在各种机器上轻松实现并行化。 Map / Reduce作业是一个并行化的过程,IMO尝试对同一数据应用多个操作并不是真的有意义,如果你需要你可以用我上面写的扩展你的Reducer,或者写另一份工作。
答案 1 :(得分:1)
虽然Charles的回答解释了MapReduce概念背后的原因,但你可以很好地在初始映射函数之后通过覆盖run()
来创建所需数量的函数调用。 Mapper
类(新API)
@override
public void run(Context context) throws IOException, InterruptedException {
setup(context);
while (context.nextKeyValue()) {
map(context.getCurrentKey(), context.getCurrentValue(), context);
}
// Call all your methods you want here
cleanup(context);
}
你也可以在减速器中做类似的事情。