hadoop mapreduce设计/路由mapper和reducer在一个作业上

mnowg1ta  于 2021-06-04  发布在  Hadoop
关注(0)|答案(1)|浏览(427)

我想做一个mapreduce设计像这样在一个工作。
例子:
我想要一份工作:*************************************************************
[mapper a]-->[mapper c]
[mapper b]-->[reducer b]
在此之后,[b]->[mapper c]
[mapper c]-->[reducer c]******************************************************************************
所以[mapper a]&[reducer b]-->[mapper c]。下一步[mapper c]继续[reducer c]。我希望上面所有的场景都在一个作业上运行。
就像一个mapreduce作业中的路由。我可以将许多Map器路由到特定的reducer,并在一个作业中再次将其继续到其他Map器而不是reducer。我需要你的建议,兄弟
谢谢。。。。。

nhn9ugyo

nhn9ugyo1#

--edit开始简化问题,假设您有三个joba、jobb、jobc作业,每个作业由一个map和一个reduce阶段组成。现在您想在jobc的mapper任务中使用joba的mapper输出,因此jobc只需要等待joba完成其Map任务,您可以在joba中使用multipleoutputs类在jobc可以轮询的位置保存/写入Map阶段输出--编辑端点
通过编程,您可以执行以下代码,其中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是一个工作流管理工具,它允许您配置和安排作业--编辑端点
希望这有帮助。

相关问题