多输出hadoop

时间:2011-04-13 22:14:45

标签: hadoop

  

可能重复:
  MultipleOutputFormat in hadoop

如何在示例中更改WordCount.java程序中的代码,以便将每个文件的WordCounts输出放在单独的文件中。也就是说,而不是只有一个wordcount所有文件在该默认的part-00000文件中。此外,输出文件的名称始终为part-00000或其他名称,我可以为此文件选择我想要的输出文件名,如果是,如何?

我想我必须以某种方式在主要配置这个,但我搜索了这个,我找不到怎么做?

  public static void main(String[] args) throws Exception {
    Configuration conf = new Configuration();
    String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
    if (otherArgs.length != 2) {
      System.err.println("Usage: wordcount <in> <out>");
      System.exit(2);
    }
    Job job = new Job(conf, "word count");
    job.setJarByClass(WordCount.class);
    job.setMapperClass(TokenizerMapper.class);
    job.setCombinerClass(IntSumReducer.class);
    job.setReducerClass(IntSumReducer.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(IntWritable.class);
    FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
    FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
    System.exit(job.waitForCompletion(true) ? 0 : 1);
  }

任何帮助表示赞赏, 泰德

2 个答案:

答案 0 :(得分:3)

查看属于Hadoop api的MultipleOutputFormat或MultipleOutputs。这些都应该解决你的问题。 MultipleOutputFormat允许您根据键/值的任何部分(或组合)指定文件路径。以下是来自 Hadoop,权威指南的示例:

protected String generateFileNameForKeyValue(NullWritable key, Text value,
String name) {
  parser.parse(value);
  return parser.getStationId() + "/" + parser.getYear();
}

对于MultipleOutputFormat,所有文件都具有相同的格式,但结果将根据生成的文件名写入不同的文件。

对于MultipleOutputs,您也可以使用多种不同的输出格式保存结果。例如,如果您正在处理具有警告,信息消息和错误的服务器日志,则可以将每种类型的消息保存到不同的文件(通过MultipleOutputs),并以不同方式格式化每种类型的输出。

答案 1 :(得分:0)

每个缩减器都会有一个部分XXXXX文件输出。将mapred.reduce.tasks调整为适当的数字(通常是您拥有的机器数量的倍数),这就是您将拥有多少输出文件。

就为文件选择名称而言,最简单的方法是在作业完成后重命名。