1

我需要向 Hadoop 提交几个作业,这些作业都是相关的(这就是它们由同一个驱动程序类启动的原因)但彼此完全独立。现在我开始这样的工作:

int res = ToolRunner.run(new Configuration(), new MapReduceClass(params), args);

它运行一个作业,获取返回码,然后继续。

我想做的是提交几个这样的作业以并行运行,检索每个作业的返回码。

(对我而言)显而易见的想法是启动多个线程,每个线程负责一个 hadoop 作业,但我想知道 hadoop 是否有更好的方法来完成此任务?我没有任何编写并发代码的经验,所以我宁愿不花很多时间学习它的复杂性,除非这里有必要。

4

2 回答 2

3

这可能是一个建议,但暗示了代码,所以我将其作为答案。

在这段代码(个人代码)中,我只是迭代了一些变量,并多次提交一个作业(同一个作业)。

使用 job.waitForCompletion(false) 将帮助您提交多个作业。

while (processedInputPaths < inputPaths.length) {

    if (processedInputPaths + inputPathsLimit < inputPaths.length) {
        end = processedInputPaths + inputPathsLimit - 1;
    } else {
        end = inputPaths.length - 1;
    }
    start = processedInputPaths;

    Job job = this.createJob(configuration, inputPaths, cycle, start, end, outputPath + "/" + cycle);

    boolean success = job.waitForCompletion(true);

    if (success) {
        cycle++;
        processedInputPaths = end + 1;
    } else {
        LOG.info("Cycle did not end successfully :" + cycle);
        return -1;
    }

}
于 2013-03-01T14:06:25.947 回答
1

psabbate 的回答让我找到了一些我遗漏的 API。这就是我解决它的方法:

在驱动程序类中,使用如下代码启动作业:

List<RunningJob> runningJobs = new ArrayList<RunningJob>();
for (String jobSpec: jobSpecs) {
    // Configure, for example, a params map that gets passed into the MR class's constructor
    ToolRunner.run(new Configuration(), new MapReduceClass(params, runningJobs), null);
}

for (RunningJob rj: runningJobs) {
    System.err.println("Waiting on job "+rj.getID());
    rj.waitForCompletion();
}

然后,在 MapReduceClass 中,定义一个私有变量List<RunningJob> runningJobs,定义一个构造函数,如下所示:

public MergeAndScore(Map<String, String> p, List<RunningJob> rj) throws IOException {
    params = Collections.unmodifiableMap(p);
    runningJobs = rj;
}

在调用的run()方法中,定义你的并提交作业ToolRunnerJobConf

JobClient jc = new JobClient();
jc.init(conf);
jc.setConf(conf);
runningJobs.add(jc.submitJob(conf));

这样,run()立即返回,并且可以通过runningJobs驱动程序类中的对象访问作业。

请注意,我正在使用旧版本的 Hadoop,因此jc.init(conf)和/或jc.setConf(conf)可能需要也可能不需要,具体取决于您的设置,尽管可能至少需要其中一个。

于 2013-03-01T14:39:26.253 回答