1

我观察到有多种方法可以编写 Hadoop 程序的驱动方法。

以下方法在Yahoo 的 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);
  }

Hadoop The Definitive Guide 2012Oreilly在书中给出了这种方法。

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(纱线),我很惊讶地发现他们使用了已弃用的类。

我想知道大家都用什么方法?

4

2 回答 2

5

我使用前一种方法。如果我们重写 run() 方法,我们可以使用 hadoop jar 选项,如 -D、-libjars、-files 等。所有这些在几乎任何 hadoop 项目中都是非常必要的。不确定我们是否可以通过 main() 方法使用它们。

于 2013-04-24T07:39:58.913 回答
4

与您的第一个(雅虎)块略有不同 - 您应该使用利用 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));
    }
}
于 2013-04-24T11:39:32.843 回答