输出一个mapreduce程序作为另一个mapreduce程序的输入

时间:2015-06-15 18:24:10

标签: java hadoop mapreduce reduce mapper

我正在尝试一个简单的例子,其中一个MapReduce作业的输出应该是另一个MapReduce作业的输入。

流程应如下所示:Mapper1 --> Reducer1 --> Mapper2 --> Reducer2(Mapper1的输出必须是Reducer1的输入.Redcer1的输出必须是Mapper2的输入.Mapper2的输出必须是Reducer2的输入。 Reducer2的输出必须存储在输出文件中)。

如何在程序中添加多个Mappers和Reducers,以便像上面一样维护流程?

我是否需要使用Chain Mappers或Chain Reducers?如果是这样,我该如何使用它们?

2 个答案:

答案 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 */