我正在尝试在Hadoop中运行多个Map/Reduce任务。在google上搜索之后,我选择了http://cloudcelebrity.wordpress.com/2012/03/30/how-to-chain-multiple-mapreduce-jobs-in-hadoop/上描述的方法2:使用JobControl。我得到了以下错误:
/examples2/format/Dictionary.java:100: error: no suitable method found for addJob(org.apache.hadoop.mapreduce.Job)
jbcntrl.addJob(job);
^
method JobControl.addJob(org.apache.hadoop.mapred.jobcontrol.Job) is not applicable
(actual argument org.apache.hadoop.mapreduce.Job cannot be converted to org.apache.hadoop.mapred.jobcontrol.Job by method invocation conversion)
正如在使用mapred或mapreduce包创建Hadoop Job中所描述的那样?,有两个不同的API,这里似乎不一致。进一步观察后,我发现了JobControl和JofConf.setMapperClass()错误。他们说使用mapreduce包org.apache.hadoop.mapreduce.lib.jobcontrol.JobControl'
instead of
'org.apache.hadoop.mapred.jobcontrol.JobControl
应该能解出来。唯一的问题是:我在用这个。当我查看这个特定的文件(hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapreduce/lib/jobcontrol/JobControl.java)时,我看到它正在使用
import org.apache.hadoop.mapred.jobcontrol.Job;
不是import org.apache.hadoop.mapreduce.Job;
在我看来是什么导致了错误(正确吗?)。除了将代码还原回映射之外,还有其他方法可以解决这个问题吗?或者运行多个M/R作业的任何其他方式?
更新:我从http://cloudcelebrity.wordpress.com/2012/03/30/how-to-chain-multiple-mapreduce-jobs-in-hadoop/得到了方法1来工作,但我仍然对问题的答案感兴趣。
mapred是较旧的API集。
请更改为mapreduce以编写进一步的MR程序。
- mapreduce api更加紧凑,并封装了context类中的大部分内容,使编码器的生活变得简单。
自从您提出问题以来已经过去了一段时间,但是您向JobControl添加了错误的对象。您需要用一个名为ControlledJob的类包装Job,然后才能将其添加到JobControl中。下面是一个小例子:
Job jobWordCount = Job.getInstance [...]
[setup jobWordCount]
Job jobSort = Job.getInstance [...]
[setup jobSort]
JobControl jobControl = new JobControl("word-count-control") {{
ControlledJob count = new ControlledJob(jobWordCount, null);
ControlledJob sort = new ControlledJob(jobSort, Arrays.asList(count));
addJob(count);
addJob(sort);
}};
Oozie是一个描述作业工作流程的系统,其中作业可能包含一组map reduce作业、pig脚本、文件系统操作等,并支持数据流的fork和join。
oozie文档中有一个包含多个MR作业的示例,包括一个fork:
http://oozie.apache.org/docs/3.2.0-incubating/WorkflowFunctionalSpec.html Appendix_B_Workflow_Examples