Hadoop mapreduce 设计 / 路由映射器和化简器在一个作业上



我想在一个作业中做一个这样的mapreduce设计。

例:

我想从事工作:

******

[映射器 A] ---> [映射器 C]

[映射器 B]

---> [减速器 B]

之后 [减速器 B] ---> [映射器 C]

[映射器 C] ---> [Reducer C]

******

所以[Mapper A]和[Reducer B]--->[Mapper C]。接下来 [映射器 C] 继续 [Reducer C]。我希望上述所有场景都在一个作业上运行。

这就像一个mapreduce作业中的路由。我可以将许多映射器路由到特定的化简器,并在一个作业中再次将其继续到除化简器以外的其他映射器。我需要你的建议兄弟

谢谢。。。。。

--编辑开始为了简化问题,假设您有三个作业 JobA、JobB、JobC,每个作业都包含一个映射和一个归约阶段。现在你想在 JobC 的映射器任务中使用 JobA 的映射器输出,所以 JobC 只需要等待 JobA 完成它的映射任务,你可以在 JobA 中使用 MultipleOutputs 类在 JobC 可以轮询的位置保留/写入映射相位输出。--编辑结束

以编程方式,您可以执行以下代码的操作,其中getJob()应在相应的Map-reduce类中定义,您可以在其中指定配置,分布式缓存,输入格式等。

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,您可以根据需要定义工作流.xml并安排每个作业的执行。SpringBatch也可以用于相同的目的,但需要一些编码和理解,如果您有背景,则可以直接使用它。--编辑开始Oozie是一个工作流管理工具,它允许您配置和安排作业。--编辑结束

希望这有帮助。

相关内容

  • 没有找到相关文章

最新更新