在MapReduce中编写多个O / P文件时出现问题

时间:2015-04-08 05:08:20

标签: hadoop mapreduce multipleoutputs

我需要根据过滤条件将输入文件拆分为2个输出文件。我的输出目录应如下所示:

/hdfs/base/dir/matched/YYYY/MM/DD
/hdfs/base/dir/notmatched/YYYY/MM/DD

我正在使用MultipleOutputs类在我的map函数中拆分数据。 在我的驱动程序类中,我使用如下:

FileOutputFormat.setOutputPath(job, new Path("/hdfs/base/dir"));

在Mapper中我正在使用以下内容:

mos.write(key, value, fileName); // File Name is generating based on filter criteria

这个程序工作正常一天。但在第二天,我的节目没有说:

Exception in thread "main" org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://nameservice1/hdfs/base/dir already exists

第二天我不能使用不同的基目录。

我该如何处理这种情况?

注意:我不想阅读输入twise以创建2个单独的文件。

2 个答案:

答案 0 :(得分:1)

创建自定义o / p格式类,如下所示

package com.visa.util;

import java.io.IOException;

import org.apache.hadoop.mapreduce.JobContext;
import org.apache.hadoop.mapreduce.OutputCommitter;
import org.apache.hadoop.mapreduce.RecordWriter;
import org.apache.hadoop.mapreduce.TaskAttemptContext;
import org.apache.hadoop.mapreduce.lib.output.SequenceFileOutputFormat;

public class CostomOutputFormat<K, V> extends SequenceFileOutputFormat<K, V>{

    @Override
    public void checkOutputSpecs(JobContext arg0) throws IOException {
    }

    @Override
    public OutputCommitter getOutputCommitter(TaskAttemptContext arg0) throws IOException {
        return super.getOutputCommitter(arg0);
    }

    @Override
    public RecordWriter<K, V> getRecordWriter(TaskAttemptContext arg0) throws IOException, InterruptedException {
        return super.getRecordWriter(arg0);
    }

}

并在驱动程序类中使用它:

job.setOutputFormatClass(CostomOutputFormat.class);

将跳过检查是否存在o / p目录。

答案 1 :(得分:-1)

您的输出值中可以有一个标志列。稍后您可以处理输出并通过标志列将其拆分。