我想在一个作业中做一个这样的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是一个工作流管理工具,它允许您配置和安排作业。--编辑结束
希望这有帮助。