链接多个hadoop工作并提交而无需等待

时间:2013-03-21 15:39:15

标签: java hadoop mapreduce hdfs

我正在试图找出如何链接多个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());
}

所有作业立即运行,我得到如下输出:

  • 没有工作jar文件集。可能找不到用户类。请参阅JobConf(Class)或JobConf#setJar(String)。
  • 要处理的总输入路径:1
  • 使用GenericOptionsParser解析参数。应用程序应该实现相同的工具。
  • 没有工作jar文件集。可能找不到用户类。请参阅JobConf(Class)或JobConf#setJar(String)。
  • 要处理的总输入路径:0
  • 使用GenericOptionsParser解析参数。应用程序应该实现相同的工具。
  • 没有工作jar文件集。可能找不到用户类。请参阅JobConf(Class)或JobConf#setJar(String)。
  • 要处理的总输入路径:0
  • 使用GenericOptionsParser解析参数。应用程序应该实现相同的工具。
  • 没有工作jar文件集。可能找不到用户类。请参阅JobConf(Class)或JobConf#setJar(String)。
  • 要处理的总输入路径:0

我做错了什么?

注意:我正在使用Hadoop 0.20.205

编辑澄清:我需要能够向集群提交作业链,然后立即返回,而无需等待作业链完成。

3 个答案:

答案 0 :(得分:2)

JobControl应该用于设置作业之间的依赖关系。在给定代码中未设置依赖项,因此作业并行运行而不是按顺序运行。如果有更复杂的工作流程,那么可以使用Oozie。

Here是一篇有趣的文章。

答案 1 :(得分:1)

自从我处理了这个问题已经有几年了,但我看到了几件事:

  1. 您的错误与作业之间的链接无关。确保在担心链接之前能够完成一项工作。
  2. Jobcontrol没有(或者至少在2010年没有)将作业序列提交给作业跟踪器,它只是一个工具来处理上游作业何时完成并自动提交作业跟踪器的下一个作业。你将无法运行它并退出。
  3. 你不应该在工作上打电话提交。提交它们运行。你应该把控制权交给那里的工作控制。
  4. 我认为这令人困惑,并开始在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);