Java 组合器在HBase scan mapreduce中创建每个区域的mapoutput文件

Java 组合器在HBase scan mapreduce中创建每个区域的mapoutput文件,java,hadoop,mapreduce,hadoop2,Java,Hadoop,Mapreduce,Hadoop2,您好,我正在运行一个从HBase读取记录并写入文本文件的应用程序 我在我的应用程序中使用了组合器,也使用了自定义分区器。 我在应用程序中使用了41 reducer,因为我需要创建满足自定义分区器条件的40 reducer输出文件 所有工作正常,但当我在应用程序中使用combiner时,它会为每个区域或每个映射器创建映射输出文件 例如,我的应用程序中有40个区域,因此启动了40个映射程序,然后创建了40个映射输出文件。 但reducer无法组合所有贴图输出并生成最终的reducer输出文件,该文件

您好,我正在运行一个从HBase读取记录并写入文本文件的应用程序

我在我的应用程序中使用了组合器,也使用了自定义分区器。 我在应用程序中使用了41 reducer,因为我需要创建满足自定义分区器条件的40 reducer输出文件

所有工作正常,但当我在应用程序中使用combiner时,它会为每个区域或每个映射器创建映射输出文件

例如,我的应用程序中有40个区域,因此启动了40个映射程序,然后创建了40个映射输出文件。 但reducer无法组合所有贴图输出并生成最终的reducer输出文件,该文件将是40个reducer输出文件

文件中的数据正确,但没有增加任何文件

你知道我怎样才能只得到reducer的输出文件吗

// Reducer Class
    job.setCombinerClass(CommonReducer.class);
    job.setReducerClass(CommonReducer.class); // reducer class
下面是我的工作细节

Submitted:  Mon Apr 10 09:42:55 CDT 2017
Started:    Mon Apr 10 09:43:03 CDT 2017
Finished:   Mon Apr 10 10:11:20 CDT 2017
Elapsed:    28mins, 17sec
Diagnostics:    
Average Map Time    6mins, 13sec
Average Shuffle Time    17mins, 56sec
Average Merge Time  0sec
Average Reduce Time     0sec 
这是我的逻辑

import java.io.IOException;
import org.apache.log4j.Logger;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.output.MultipleOutputs;

public class CommonCombiner extends Reducer<NullWritable, Text, NullWritable, Text> {

    private Logger logger = Logger.getLogger(CommonCombiner.class);
    private MultipleOutputs<NullWritable, Text> multipleOutputs;
    String strName = "";
    private static final String DATA_SEPERATOR = "\\|\\!\\|";

    public void setup(Context context) {
        logger.info("Inside Combiner.");
        multipleOutputs = new MultipleOutputs<NullWritable, Text>(context);
    }

    @Override
    public void reduce(NullWritable Key, Iterable<Text> values, Context context)
            throws IOException, InterruptedException {

        for (Text value : values) {
            final String valueStr = value.toString();
            StringBuilder sb = new StringBuilder();
            if ("".equals(strName) && strName.length() == 0) {
                String[] strArrFileName = valueStr.split(DATA_SEPERATOR);
                String strFullFileName[] = strArrFileName[1].split("\\|\\^\\|");

                strName = strFullFileName[strFullFileName.length - 1];


                String strArrvalueStr[] = valueStr.split(DATA_SEPERATOR);
                if (!strArrvalueStr[0].contains(HbaseBulkLoadMapperConstants.FF_ACTION)) {
                    sb.append(strArrvalueStr[0] + "|!|");
                }
                multipleOutputs.write(NullWritable.get(), new Text(sb.toString()), strName);
                context.getCounter(Counters.FILE_DATA_COUNTER).increment(1);


            }

        }
    }


    public void cleanup(Context context) throws IOException, InterruptedException {
        multipleOutputs.close();
    }
}
import java.io.IOException;
导入org.apache.log4j.Logger;
导入org.apache.hadoop.io.NullWritable;
导入org.apache.hadoop.io.Text;
导入org.apache.hadoop.mapreduce.Reducer;
导入org.apache.hadoop.mapreduce.lib.output.MultipleOutputs;
公共类CommonCombiner扩展了Reducer{
专用记录器=Logger.getLogger(CommonCombiner.class);
专用多路输出多路输出;
字符串strName=“”;
私有静态最终字符串数据\u分隔符=“\\\\\!\\\\\\”;
公共无效设置(上下文){
logger.info(“内部组合器”);
multipleoutput=新的multipleoutput(上下文);
}
@凌驾
公共void reduce(NullWritable键、Iterable值、上下文)
抛出IOException、InterruptedException{
用于(文本值:值){
最终字符串值str=value.toString();
StringBuilder sb=新的StringBuilder();
如果(“.equals(strName)&&strName.length()==0){
字符串[]strArrFileName=valueStr.split(数据分隔符);
字符串strFullFileName[]=strArrFileName[1]。拆分(\\\\\\\^\\\\\\\\\);
strName=strFullFileName[strFullFileName.length-1];
字符串strArrvalueStr[]=valueStr.split(数据分隔符);
如果(!strArrvalueStr[0]。包含(HbaseBulkLoadMapperConstants.FF_操作)){
sb.追加(strArrvalueStr[0]+“|!|””;
}
multipleOutputs.write(nullwriteable.get()、新文本(sb.toString()、strName);
context.getCounter(Counters.FILE\u DATA\u COUNTER).increment(1);
}
}
}
公共无效清除(上下文上下文上下文)引发IOException、InterruptedException{
multipleoutput.close();
}
}

我已经替换了
多输出.write(nullwriteable.get()、新文本(sb.toString()、strName)

我得到了正确的输出

context.write()