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

Hadoop 在MapReduce中写入多个O/P文件时出现问题,hadoop,mapreduce,multipleoutputs,Hadoop,Mapreduce,Multipleoutputs,我需要根据筛选条件将输入文件拆分为2个输出文件。我的输出目录应如下所示: /hdfs/base/dir/matched/YYYY/MM/DD /hdfs/base/dir/notmatched/YYYY/MM/DD FileOutputFormat.setOutputPath(job, new Path("/hdfs/base/dir")); 我正在使用multipleoutput类在映射函数中分割数据。 在我的驱动程序类中,我使用如下: /hdfs/base/dir/matched/YYY

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

/hdfs/base/dir/matched/YYYY/MM/DD
/hdfs/base/dir/notmatched/YYYY/MM/DD
FileOutputFormat.setOutputPath(job, new Path("/hdfs/base/dir"));
我正在使用
multipleoutput
类在映射函数中分割数据。 在我的驱动程序类中,我使用如下:

/hdfs/base/dir/matched/YYYY/MM/DD
/hdfs/base/dir/notmatched/YYYY/MM/DD
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
我不能在第二天使用不同的基本目录

我如何处理这种情况


注意:我不想通过两次读取输入来创建两个单独的文件。

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

创建自定义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);
    }

}

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

因此,您的问题是对所有执行使用相同的输出目录。。我说的对吗?是的。。。我想使用
multipleoutput
(在映射器中)而不是
FileOutputFormat来控制实际的o/p目录。setOutputPath
(在驱动程序类中)通常hadoop会为每次执行创建一个新目录。MultipleOutputs类用于将数据写入不同的文件。不能将同一目录用于所有执行。您需要从中删除已创建的基本目录。概念。