(我确定这被问过几次,但是这是一个普遍的“模糊”问题,hadoop api本身和版本号是如此令人困惑我觉得我所有的谷歌搜索实际上都没用。所以我对不起,如果这是微不足道的话)
我一直在尝试使用新工具界面在hadoop中运行作业。我被告知作为一般规则,如果我使用新的api,我应该避免使用org.apache.hadoop.mapred并仅使用'org.apache.hadoop.mapreduce'包中的类。
但是,在tool下的新api文档中查看代码示例时:
public int run(String[] args) throws Exception {
// Configuration processed by ToolRunner
Configuration conf = getConf();
// Create a JobConf using the processed conf
JobConf job = new JobConf(conf, MyApp.class);
// Process custom command-line options
Path in = new Path(args[1]);
Path out = new Path(args[2]);
// Specify various job-specific parameters
job.setJobName("my-app");
job.setInputPath(in);
job.setOutputPath(out);
job.setMapperClass(MyMapper.class);
job.setReducerClass(MyReducer.class);
// Submit the job, then poll for progress until the job is complete
JobClient.runJob(job);
return 0;
}
似乎他们使用旧版api中的JobConf类,这也会给我带来错误。特别是我得到了
尝试设置我的map,reduce,combiner类时,JobConf类型中的setPartitionerClass(Class)方法不适用于参数
和其他错误相应。
使用新api中的'Job'类对我有用,但所有它的构造函数都被标记为已弃用。这样做的正确方法是什么?
当尝试使用 new api中的JobControl类时,这会变得更加难看,因为旧 api出于某种原因wants to use the "Job" class。再次使用旧api中的job类要求我也使用旧的JobConf类。我觉得这里有一些非常基本的东西。
有人可以帮忙吗?答案 0 :(得分:0)
使用新api中的'Job'类对我有用,但所有它的构造函数都被标记为已弃用。这样做的正确方法是什么?
在新API中获取作业的非弃用方式是......
Job job = Job.getInstance(new Configuration());
当尝试使用新api中的JobControl类时,这会变得更加丑陋。由于某种原因,它希望使用旧api中的“Job”类。再次使用旧api中的作业类要求我也使用旧的JobConf类。
当新API的设计考虑到向后兼容性时,总是有点混乱。
JobControl.addJob(org.apache.hadoop.mapred.jobcontrol.Job)
将旧作业作为输入,
JobControl.addJob(new ControlledJob(org.apache.hadoop.mapreduce.Job, ...))
将新作业作为输入。