我写了一些hadoop代码来读取映射文件并将其分成 block 并将其写入许多文件,如下所示:
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++;
}
}
在 reduce 中,我这样做:
public void reduce(IntWritable key, Iterator<Text> values,
OutputCollector<IntWritable, Text> output, Reporter reporter) throws IOException {
while(values.hasNext()){
output.collect(key, values.next());
}
}
我的MultiFile类如下:
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/Value Class 等。
我做错了什么?我的输出目录总是空的。
谢谢
最佳答案
程序看起来有点复杂。如果目的是将文件拆分为多个文件,则可以通过多种方式完成。不需要 Map 和 Reduce 作业,只需一个 Map 作业就足够了。
使用 o.a.h.mapred.lib.NLineInputFormat 从输入中一次读取 N 行到映射器,然后将这 N 行写入文件。
在上传文件时将dfs.blocksize设置为所需的文件大小,然后每个mapper将处理一个InputSplit,该InputSplit可以写入文件。
关于java - Hadoop 多输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8335217/