我想在一项工作中进行这样的mapreduce设计。
范例:
我想要一份工作:************************************************ *****************
[映射器A] ---> [映射器C]
[映射器B] ---> [ reducer B]
之后[Reducer B] ---> [Mapper C]
[映射器C] ---> [ reducer C] ****************************************** ********************************************
因此,[映射器A]和[归约器B] ---> [映射器C]。接下来,[映射器C]继续执行[归约器C]。我希望以上所有方案都能完成一项工作。
这就像在一个mapreduce作业中进行路由。我可以在一个作业中将许多映射器路由到特定的reducer,然后再将其继续到非reducer的其他映射器。我需要你的建议
谢谢.....
最佳答案
-编辑开始
为了简化问题,假设您有三个作业JobA,JobB,JobC,每个作业都包含一个映射和一个缩小阶段。
现在,您要在JobC的映射器任务中使用JobA的映射器输出,因此JobC只需要等待JobA完成其映射任务,就可以在JobA中使用MultipleOutputs类在JobC可以保存的位置保存/写入映射阶段输出。投票。
-编辑结束
在编程上,您可以执行以下代码,其中getJob()应该在相应的Map-reduce类中定义,您可以在其中指定配置,DistributedCache,输入格式等。
main () {
processMapperA();
processMapReduceB();
processMapReduceC();
}
processMapperA()
{
// configure the paths/inputs needed, for example sake I am taking two paths
String path1 = "path1";
String path2 = "path2";
String[] mapperApaths = new String[]{path1, path2};
Job mapperAjob = MapperA.getJob(mapperApaths, <some other params you want to pass>);
mapperAjob.submit();
mapperAjob.waitForCompletion(true);
}
processMapReduceB()
{
// init input params to job
.
.
Job mapReduceBjob = MapReduceB.getJob(<input params you want to pass>);
mapReduceBjob.submit();
mapReduceBjob.waitForCompletion(true);
}
processMapReduceC()
{
// init input params to job
.
.
Job mapReduceCjob = MapReduceC.getJob(<input params you want to pass like outputMapperA, outputReducerB>);
mapReduceCjob.submit();
mapReduceCjob.waitForCompletion(true);
}
要获得对工作流程的更多控制,可以考虑使用Oozie或SpringBatch。
使用Oozie,您可以定义workflow.xml,并根据需要计划每个作业的执行。
SpringBatch也可以用于相同的功能,但是需要一定的编码和理解,如果您有背景知识,可以立即使用。
-编辑开始
Oozie是工作流管理工具,它使您可以配置和安排作业。
-编辑结束
希望这可以帮助。
关于hadoop - Hadoop mapreduce设计/路由映射器和化简器一次完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28187226/