如果我们通过在Mapreduce中保留mapper和combiner来跳过reducer会发生什么

时间:2015-03-05 07:51:19

标签: mapreduce

我的输入文件大小为10 GB,位于

/user/cloudera/inputfiles/records.txt

这是我的Driver类代码:

public class WordCountMain {

/**
 * @param args
 */
public static void main(String[] args) throws Exception {
    // TODO Auto-generated method stub

    Configuration conf = new Configuration();

    Path inputFilePath = new Path(args[0]);
    Path outputFilePath = new Path(args[1]);




Job job = new Job(conf,"word count");
job.getConfiguration().set("mapred.job.queue.name","omega");

    job.setJarByClass(WordCountMain.class);



    FileInputFormat.addInputPath(job, inputFilePath);
    FileOutputFormat.setOutputPath(job, outputFilePath);

    job.setInputFormatClass(TextInputFormat.class);
    job.setOutputFormatClass(TextOutputFormat.class);

    job.setMapperClass(WordCountMapper.class);
    job.setCombinerClass(WordCountCombiner.class);
    job.setNumReduceTasks(0);
    job.setMapOutputKeyClass(Text.class);
    job.setMapOutputValueClass(IntWritable.class);

    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(IntWritable.class);

    System.exit(job.waitForCompletion(true) ? 0 : 1);

}

}

我有Mapper和Combiner的代码,我已将reducer设置为零

这是我的Mapper代码:

public class WordCountMapper extends Mapper<Object,Text,Text,IntWritable>
{
public static IntWritable one = new IntWritable(1);

    protected void map(Object key, Text value, Context context) throws java.io.IOException,java.lang.InterruptedException
    {

    String line =   value.toString();
    String eachWord =null;
    StringTokenizer st = new StringTokenizer(line,"|");

    while(st.hasMoreTokens())
    {
        eachWord = st.nextToken();
        context.write(new Text(eachWord), one);
    }


    }
}

我写了自己的合并器

这是我的Combiner代码:

public class WordCountCombiner extends Reducer<Text ,IntWritable,Text,IntWritable> {


protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws java.io.IOException, java.lang.InterruptedException
{
    int count =0;
    for(IntWritable i : values)
    {
        count =count+i.get();
    }
    context.write(key, new IntWritable(count));
}

}

我的问题是它将存储什么输出。

Mapper的输出或组合器的输出?

Or Combiner只有在写入减速器阶段时才会执行?

请帮忙

2 个答案:

答案 0 :(得分:0)

您无法确定组合器功能将运行多少次,或者它是否会运行。如果为作业指定reducer,则运行组合器也不依赖于此。在您的情况下,它将只生成160个输出文件(10240/64 = 160)

答案 1 :(得分:0)

通过跳过mapper和reducer的设置,hadoop将使用其默认映射向前移动。 例如,它将使用

  1. IdentityMapper.class作为默认映射器。

  2. 默认输入格式为TextInputFormat。

  3. 默认分区程序是HashPartitione。

  4. 默认情况下,只有一个reducer,因此只有一个分区。

  5. 默认的reducer是Reducer,也是泛型类型。

  6. 默认输出格式是TextOutputFormat,它通过将键和值转换为字符串并用制表符分隔它们来写出每行一个记录