【问题标题】:Hadoop ClassCastException for default value of InputFormatInputFormat 的默认值的 Hadoop ClassCastException
【发布时间】:2013-04-04 14:36:09
【问题描述】:

我在开始使用 Hadoop 上的第一个 map-reduce 代码时遇到了问题。我从“Hadoop:权威指南”复制了以下代码,但我无法在我的单节点 Hadoop 安装上运行它。

我的代码 sn-p:

主要:

Job job = new Job(); 
job.setJarByClass(MaxTemperature.class);
job.setJobName("Max temperature");

FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));

job.setMapperClass(MaxTemperatureMapper.class);
job.setReducerClass(MaxTemperatureReducer.class);

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

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

映射器:

public void map(LongWritable key, Text value, Context context)

减速机:

public void reduce(Text key, Iterable<IntWritable> values,
Context context)

map 和 reduce 函数的实现也仅选自书中。但是当我尝试执行这段代码时,这是我得到的错误:

INFO mapred.JobClient: Task Id : attempt_201304021022_0016_m_000000_0, Status : FAILED
    java.lang.ClassCastException: interface javax.xml.soap.Text
    at java.lang.Class.asSubclass(Class.java:3027)
    at org.apache.hadoop.mapred.JobConf.getOutputKeyComparator(JobConf.java:774)
    at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.<init>(MapTask.java:959)
    at org.apache.hadoop.mapred.MapTask$NewOutputCollector.<init>(MapTask.java:674)
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:756)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:370)
    at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:396)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1149)
    at org.apache.hadoop.mapred.Child.main(Child.java:249)

过去对类似问题的回答 (Hadoop type mismatch in key from map expected value Text received value LongWritable) 帮助我弄清楚 InputFormatClass 应该与 map 函数的输入相匹配。所以我也尝试使用 job.setInputFormatClass(TextInputFormat.class);在我的主要方法中,但它也没有解决问题。这可能是什么问题?

这里是Mapper类的实现

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class MaxTemperatureMapper extends Mapper<LongWritable, Text, Text, IntWritable>     {

private static final int MISSING = 9999;

@Override
public void map(LongWritable key, Text value, Context context)
  throws IOException, InterruptedException {

  String line = value.toString();
  String year = line.substring(15, 19);

  int airTemperature;
  if (line.charAt(45) == '+') { // parseInt doesn't like leading plus signs
    airTemperature = Integer.parseInt(line.substring(46, 50));
  } else {
    airTemperature = Integer.parseInt(line.substring(45, 50));
  }
  String quality = line.substring(50, 51);
  if (airTemperature != MISSING && quality.matches("[01459]")) {
    context.write(new Text(year), new IntWritable(airTemperature));
  }
 }

}

【问题讨论】:

    标签: hadoop mapreduce


    【解决方案1】:

    您自动导入了错误的导入。而不是导入 org.apache.hadoop.io.Text 你导入 import javax.xml.soap.Text

    您可以在此blog 中找到示例错误导入。

    【讨论】:

      【解决方案2】:

      看起来您导入了错误的 Text 类 (javax.xml.soap.Text)。你想要 org.apache.hadoop.io.Text

      【讨论】:

      • 克里斯,我不知道 javax.xml.soap.Text 来自哪里。我正在使用 org.apache.hadoop.io.Text 并且我没有在代码中包含任何其他第三方 jar。
      • 您检查了包含 main() 方法的类并检查了您的 Mapper 类?看起来异常是在映射器中引发的。如果您仍在寻找,只需发布​​整个 Mapper 类,但关注您在上下文中写入的声明类型。
      • 谢谢克里斯,我在我的主要方法中使用了 javax.xml.soap.Text。忽略了它。将其更改为 org.apache.hadoop.io.Text 解决了问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-12
      • 2015-01-25
      • 2016-10-29
      相关资源
      最近更新 更多