2011-12-01 87 views
0

我写了一些Hadoop的代码读取映射文件,并将其分割成块,并把它写入许多文件如下:Hadoop的多路输出

public void map(LongWritable key, Text value, OutputCollector<IntWritable, Text> 
output,Reporter reporter) throws IOException { 
String line = value.toString(); 
    int totalLines = 2000; 
int lines = 0; 
    int fileNum = 1; 
String[] linesinfile = line.split("\n"); 
    while(lines<linesinfile.length) { 
     // I do something like, if lines = totalLines, { 
     output.collect(new IntWritable(fileNum), new  
      Text(linesinfile[lines].toString())); 
     fileNum++; 
     lines = 0; 
     } 
    lines++; 
    } 
} 

在降低,我做的:

public void reduce(IntWritable key, Iterator<Text> values, 
OutputCollector<IntWritable, Text> output, Reporter reporter) throws IOException { 
    while(values.hasNext()){ 
    output.collect(key, values.next()); 
} 
} 

我的多文件类如下:

public class MultiFileOutput extends MultipleTextOutputFormat<IntWritable, Text> { 

protected String generateFileNameForKeyValue(IntWritable key, Text content, String 
      fileName) { 
    return key.toString() + "-" + fileName; 
} 
} 

在主,我说:

conf.setInputFormat(TextInputFormat.class); 
    conf.setOutputFormat(MultiFileOutput.class); 

除了设置OutKey /值类等

我在做什么错?我的输出目录始终为空。

谢谢

回答

2

该程序看起来有点复杂。如果目的是将文件分成多个文件,那么可以通过几种方法完成。不需要Map和Reduce作业,只需一份Map作业就足够了。

  • 使用o.a.h.mapred.lib.NLineInputFormat到一次读取N行从输入映射器,然后写那些N行到文件中。

  • 在上载文件时将dfs.blocksize设置为所需的文件大小,然后每个映射器将处理一个可写入文件的InputSplit。

+0

谢谢。其实我有一种误解,认为hadoop只会将输入文件的数量设置为许多映射器(我刚刚开始使用hadoop)。现在我已经将numMapTasks设置为5000。 – svk