java - Hadoop 多输出

标签 java hadoop

我写了一些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/

相关文章:

java - 在 jar 中使用 JAR

java - java中如何替换除下划线和数字以外的所有特殊字符?

java - 方法引用转换如何工作?

java - 从 java 代码调用 ruby​​ 脚本

bash - 无需按回车即可生成 SSH key

hadoop大数据集

java - 使用 EMV 芯片读取信用卡并将数据写入基于 Web 浏览器的 POS 屏幕

sql - Hive 返回每个用户的操作列表

hadoop - 如何估算一个 Hadoop 集群?

caching - 将一个大文件(~6 GB)从 S3 复制到 Elastic MapReduce 集群的每个节点