我观察到有多种方法可以编写Hadoop程序的驱动方法。
中给出了以下方法 public void run(String inputPath, String outputPath) throws Exception {
JobConf conf = new JobConf(WordCount.class);
conf.setJobName("wordcount");
// the keys are words (strings)
conf.setOutputKeyClass(Text.class);
// the values are counts (ints)
conf.setOutputValueClass(IntWritable.class);
conf.setMapperClass(MapClass.class);
conf.setReducerClass(Reduce.class);
FileInputFormat.addInputPath(conf, new Path(inputPath));
FileOutputFormat.setOutputPath(conf, new Path(outputPath));
JobClient.runJob(conf);
}
这个方法在Oreilly的Hadoop The Definitive Guide 2012
一书中给出。
public static void main(String[] args) throws Exception {
if (args.length != 2) {
System.err.println("Usage: MaxTemperature <input path> <output path>");
System.exit(-1);
}
Job job = new Job();
job.setJarByClass(MaxTemperature.class);
job.setJobName("Max temperature");
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
job.setMapperClass(MaxTemperatureMapper.class);
job.setReducerClass(MaxTemperatureReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
在尝试Oreilly书中给出的程序时,我发现Job
类的构造函数已被弃用。由于Oreilly的书以Hadoop 2(纱线)为基础,我惊讶地发现他们使用了弃用的类。
我想知道每个人使用哪种方法?
答案 0 :(得分:5)
我使用前一种方法。如果我们改写run()方法,我们可以使用像-D,-libjars,-files等的hadoop jar选项。所有这些在几乎任何hadoop项目中都非常必要。 不确定我们是否可以通过main()方法使用它们。
答案 1 :(得分:4)
与您的第一个(Yahoo)块略有不同 - 您应该使用利用GenericOptionsParser的ToolRunner / Tool类(如Eswara的回答中所述)
模板模式类似于:
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
public class ToolExample extends Configured implements Tool {
@Override
public int run(String[] args) throws Exception {
// old API
JobConf jobConf = new JobConf(getConf());
// new API
Job job = new Job(getConf());
// rest of your config here
// determine success / failure (depending on your choice of old / new api)
// return 0 for success, non-zero for an error
return 0;
}
public static void main(String args[]) throws Exception {
System.exit(ToolRunner.run(new ToolExample(), args));
}
}