我有一个Hadoop程序,我需要将第一个MapReduce任务生成的单个输出传递给第二个MapReduce任务。
实施例。
MapReduce -1 - >将double值写入hdfs(文件名类似于part-00000)。 在第二个MapReduce作业中,我想使用part-00000文件中的double值。
我该怎么办?任何人都可以请给出一些代码片段。
答案 0 :(得分:0)
等待第一个作业完成,然后在第一个作业的输出上运行第二个作业。你可以这样做:
1)在驱动程序:
中 int code = firstJob.waitForCompletion(true) ? 0 : 1;
if (code) {
Job secondJob = new Job(new Configuration(), "JobChaining-Second");
TextInputFormat.addInputPath(secondJob, outputDirOfFirstJob);
...
}
2)使用 JobControl 和 ControlledJob :
http://hadoop.apache.org/docs/stable2/api/org/apache/hadoop/mapred/jobcontrol/JobControl.html
要使用 JobControl ,请先使用 ControlledJob 打包作业。这样做是 相对简单:你通常会创建你的工作,除了你也创建一个 ControlledJob 将作业或配置作为参数,以及 其依赖项列表(其他 ControlledJobs )。然后,将它们逐个添加到 JobControl 对象,用于处理其余部分。
3)外部(例如来自 shell脚本)。将输入/输出路径作为参数传递。
4)使用 Apache Oozie 。您将以XML格式指定作业。