我正在试图找出如何链接多个hadoop作业,一步的输出进入下一步的输入。我通过谷歌搜索找到的很多东西都说我应该从一个线程中一次调用一个并等待完成,或者我应该使用Job.addDependingJob()然后提交它们。我选择了后者,但是在上一个工作结束后,我似乎无法执行后续工作。
这是我的代码:
List<Job> jobs = new ArrayList<Job>();
for(int i = 0; i < stepCount; i++) {
JobConf jc = new JobConf(clusterConfig);
... set up mappers and reducers here ...
... set up input and output paths here ...
Job j = new Job(jc);
j.addDependingJob(jobs.get(jobs.size() - 1);
jobs.add(j);
}
for(Job j : Jobs) {
JobClient client = new JobClient();
client.init(j.getJobConf());
client.submit(j.getJobConf());
}
所有作业立即运行,我得到如下输出:
我做错了什么?
注意:我正在使用Hadoop 0.20.205
编辑澄清:我需要能够向集群提交作业链,然后立即返回,而无需等待作业链完成。
答案 0 :(得分:2)
JobControl应该用于设置作业之间的依赖关系。在给定代码中未设置依赖项,因此作业并行运行而不是按顺序运行。如果有更复杂的工作流程,那么可以使用Oozie。
Here是一篇有趣的文章。
答案 1 :(得分:1)
自从我处理了这个问题已经有几年了,但我看到了几件事:
我认为这令人困惑,并开始在https://github.com/kevinpet/jobcontrol中编写我自己的DAG助手,您可能会发现或者可能没有用。
答案 2 :(得分:-1)
以下是链接地图减少工作的方式。在这里,我们在第一份工作的输出上运行第二份工作:
Job job1 = new Job(conf, "job1");
Job job2 = new Job(conf,"job2");
job1.setJarByClass(driver.class);
job1.setMapperClass(Map.class);
job1.setCombinerClass(Reduce.class);
job1.setReducerClass(Reduce.class);
job1.setOutputKeyClass(Text.class);
job1.setOutputValueClass(IntWritable.class);
String outputpath="/user/hadoop/firstjoboutput";
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(outputpath));
job1.waitForCompletion(true);
job2.setJarByClass(driver.class);
job2.setMapperClass(SecondMap.class);
job2.setReducerClass(SecondReducer.class);
job2.setMapOutputKeyClass(IntWritable.class);
job2.setMapOutputValueClass(Text.class);
job2.setOutputKeyClass(Text.class);
job2.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job2, new Path(outputpath));
String finaloutput="/user/hadoop/finaloutput";
FileOutputFormat.setOutputPath(job2, new Path(finaloutput));
System.exit(job2.waitForCompletion(true) ? 0 : 1);