2011-04-13 88 views
0

可能重复:
MultipleOutputFormat in hadoop多个输出HADOOP

如何可以在实施例中改变代码在WordCount.java程序使得WordCounts的每个文件的输出是把单独的文件。也就是说,不是在该默认part-00000文件中包含一个wordcount所有文件。此外,输出文件的名称始终为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); 
    } 

任何帮助表示赞赏, 特德

+0

请显示您的多个文件输出代码。 – 2011-04-14 04:36:43

回答

0

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

至于为文件选择名称,最简单的方法是在作业完成后重命名它们。

3

查看MultipleOutputFormat或MultipleOutputs,它们是Hadoop api的一部分。其中任何一个都可以解决你的问题。 MultipleOutputFormat允许您根据键/值的任何部分(或组合)指定文件路径。下面是从Hadoop的,权威指南一个例子:

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

对于MultipleOutputFormat,所有文件都将具有相同的格式,但您的结果将取决于生成的文件名被写入到不同的文件。

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