是否有一种使用 JobControl 指定一系列依赖作业的优雅方法?
还包括一些循环,并且由于有许多顺序作业 (8),如果将所有这些都放在一个驱动程序类中,将它们全部添加到作业控制中,将会造成相当大的困惑。
怎么做?
最佳答案
Map1 -> Reduce1 -> Map2 -> Reduce2 -> Map3...
您可以通过编写多个驱动程序方法,以这种方式轻松地将作业链接在一起,每个方法一个。调用第一个驱动程序方法,它使用 JobClient.runJob() 来运行作业并等待它完成。该作业完成后,调用下一个驱动程序方法,该方法创建一个新的 JobConf 对象,引用 Mapper 和 Reducer 等的不同实例。链中的第一个作业应将其输出写入一个路径,然后用作输入第二份工作的路径。可以针对需要完成的作业重复此过程以获得完整的问题解决方案
Job 将 JobConf 对象作为其构造函数参数。作业可以通过使用 addDependingJob() 方法相互依赖。代码:
x.addDependingJob(y)
表示作业 x 在 y 成功完成之前无法开始。已经启动的作业不能添加依赖信息。给定一组作业,这些作业可以传递给 JobControl 类的一个实例。 JobControl 可以通过 addJob() 方法接收单个作业,或通过 addJobs() 接收作业集合
例如:- 如果我们有三个工作 A、B 和 C,顺序是 A -> B -> C
ControlledJob AJob= new ControlledJob(JobConf for A);
ControlledJob BJob= new ControlledJob(JobConf for B);
BJob.addDependingJob(AJob);
ControlledJob CJob= new ControlledJob(JobConf for C);
CJob.addDependingJob(BJob);
JobControl jControl = newJobControl("Name");
jControl.addJob(AJob);
jControl.addJob(BJob);
jControl.addJob(CJob);
Thread runJControl = new Thread(jControl);
runJControl.start();
while (!jControl.allFinished()) {
code = jControl.getFailedJobList().size() == 0 ? 0 : 1;
Thread.sleep(1000);
}
System.exit(1);
我们可以有单独的 getter 来获取每个作业的 JobConf,其中包含作业的所有信息。 getter 的示例代码如下:-
public static Configuration getAJobConf(Configuration conf, Path ip, Path op)throws IOException {
final Job AJob = new Job(conf, "name");
AJob.setJarByClass(Driver.class);
AJob.setInputFormatClass(InputFormat.class);
TextInputFormat.addInputPath(AJob, ip);
TextOutputFormat.setOutputPath(AJob, op);
AJob.setOutputFormatClass(tOutputFormat.class);
AJob.setMapperClass(Mapper.class);
AJob.setReducerClass(Reducer.class);
AJob.setNumReduceTasks(1);
AJob.setMapOutputKeyClass(NullWritable.class);
AJob.setMapOutputValueClass(Text.class);
AJob.setOutputKeyClass(NullWritable.class);
AJob.setOutputValueClass(Text.class);
return AJob.getConfiguration();
}
关于hadoop - 使用 JobControl Hadoop 的复杂作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30220580/