我正在尝试一个简单的例子,其中一个MapReduce作业的输出应该是另一个MapReduce作业的输入。
流程应如下所示:Mapper1 --> Reducer1 --> Mapper2 --> Reducer2
(Mapper1的输出必须是Reducer1的输入.Redcer1的输出必须是Mapper2的输入.Mapper2的输出必须是Reducer2的输入。 Reducer2的输出必须存储在输出文件中)。
如何在程序中添加多个Mappers和Reducers,以便像上面一样维护流程?
我是否需要使用Chain Mappers或Chain Reducers?如果是这样,我该如何使用它们?
答案 0 :(得分:1)
您需要为此实现两个单独的MapReduce作业。第一个作业的结果需要写入某些持久存储(如HDFS),并由第二个作业读取。 SequenceOutputFormat / InputFormat通常用于此目的。两个MapReduce作业都可以从同一个驱动程序执行。
答案 1 :(得分:1)
我猜你要找的是ControlledJob和JobControl。它恰如其分地适合您的目的。在单个Driver类中,您可以构建多个彼此依赖的作业。以下代码可能有助于您理解。
Job jobOne = Job(jobOneConf, "Job-1");
FileInputFormat.addInputPath(jobOne, jobOneInput);
FileOutputFormat.setOutputPath(jobOne, jobOneOutput);
ControlledJob jobOneControl = new ControlledJob(jobOneConf);
jobOneControl.setJob(jobOne);
Job jobTwo = Job(jobTwoConf, "Job-2");
FileInputFormat.addInputPath(jobTwo, jobOneOutput); // here we set the job-1's output as job-2's input
FileOutputFormat.setOutputPath(jobTwo, jobTwoOutput); // final output
ControlledJob jobTwoControl = new ControlledJob(jobTwoConf);
jobTwoControl.setJob(jobTwo);
JobControl jobControl = new JobControl("job-control");
jobControl.add(jobOneControl);
jobControl.add(jobTwoControl);
jobTwoControl.addDependingJob(jobOneControl); // this condition makes the job-2 wait until job-1 is done
Thread jobControlThread = new Thread(jobControl);
jobControlThread.start();
jobControlThread.join();
/* The jobControl.allFinished() can also be used to wait until all jobs are done */