代码之家  ›  专栏  ›  技术社区  ›  Akash Sharma

使用标识映射器的MapReduce作业失败,原因是“映射中的键类型不匹配”

  •  1
  • Akash Sharma  · 技术社区  · 7 年前

    只是为了学习的基础,我正在尝试创建一个MapReduce程序,而不在驱动程序类中定义映射器和减速机,以防它使用身份映射器和减速机。如果我只注释reducer,但在同时注释两者时给出错误,那么效果很好。下面是我的驾驶员等级代码。请建议。

    任何帮助都将不胜感激。提前感谢!

    Job job = Job.getInstance(getConf(), "word count");
    job.setJarByClass(WordCountRun.class);
    
    // job.setMapperClass(WordCountMapper.class);
    //job.setReducerClass(WordCountReducer.class);  
    
    //job.setNumReduceTasks(0);
    
    
    job.setOutputKeyClass(Text.class);  
    
    // job.setOutputValueClass(IntWritable.class);
    job.setOutputValueClass(Text.class);
    FileInputFormat.addInputPath(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));
    return job.waitForCompletion(true) ? 0 : 1;
    

    Error Image

    1 回复  |  直到 7 年前
        1
  •  1
  •   Chris Nauroth    7 年前

    您的代码示例不调用 Job#setInputFormatClass 。如果未明确设置输入格式,则默认值为 InputFormat TextInputFormat .

    文本输入格式 ,输入到映射器的键为 LongWritable Text .

    由于您使用的是标识映射器,并且没有指定缩减器,因此作业的输出由映射器指定。身份映射器输出输入的任何内容,因此它接收( 可长写 文本 )元组作为输入,输出相同( -&燃气轮机; 文本 )元组作为输出。

    job.setOutputKeyClass(Text.class);  
    

    这试图指定作业的输出键为 ,但如上所述,此作业的输出键实际上是 可长写 。这会导致图像中出现错误:

    Error: java.io.IOException: Type mismatch in key from map: expected org.apache.hadoop.io.Text, received org.apache.hadoop.io.LongWritable
    

    如果您取消对的呼叫 Job#setOutputKeyClass ,则错误将不再发生。

    考虑这一点的另一种方法是考虑默认的MapReduce作业有效地做到了这一点:

    job.setInputFormatClass(TextInputFormat.class);
    job.setMapperClass(Mapper.class);
    job.setMapOutputKeyClass(LongWritable.class);
    job.setMapOutputValueClass(Text.class);
    job.setPartitionerClass(HashPartitioner.class);
    job.setNumReduceTasks(1);
    job.setReducerClass(Reducer.class);
    job.setOutputKeyClass(LongWritable.class);
    job.setOutputValueClass(Text.class);
    job.setOutputFormatClass(TextOutputFormat.class);
    

    通过呼叫 job.setOutputKeyClass(Text.class)