是否有一种使用JobControl指定一系列依赖作业的优雅方法?
还包括一些循环,并且由于存在许多顺序作业(8),所以将所有这些放在一个驱动程序类中会将所有这些添加到作业控制中会非常混乱。
怎么做?
答案 0 :(得分:0)
Map1 - > Reduce1 - > Map2 - > Reduce2 - > MAP3 ...
通过编写多个驱动程序方法,您可以轻松地以这种方式将作业链接在一起,每个作业一个。调用第一个驱动程序方法,该方法使用JobClient.runJob()来运行作业并等待它完成。当该作业完成后,调用下一个驱动程序方法,该方法创建一个新的JobConf对象,引用Mapper和Reducer的不同实例等。链中的第一个作业应将其输出写入路径,然后将其用作输入第二份工作的路径。可以重复此过程,因为需要许多工作才能获得问题的完整解决方案
Job将JobConf对象作为其构造函数参数。作业可以通过使用addDependingJob()方法相互依赖。代码:
x.addDependingJob(y)
表示在y成功完成之前,作业x无法启动。在已经启动作业后,无法将依赖关系信息添加到作业中。给定一组作业,可以将这些作业传递给JobControl类的实例。 JobControl可以通过addJob()方法接收单个作业,也可以通过addJobs()接收作业集合
例如: - 如果我们有三个作业A,B和C,则序列为A - > B - > ç
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();
}