2013-04-04 3 views
1

У меня возникла проблема с моим первым кодом сокращения карты на Hadoop. Я скопировал следующий код из «Hadoop: окончательное руководство», но я не могу запустить его на моем единственном узле Hadoop.Hadoop ClassCastException для значения по умолчанию InputFormat

Мой Фрагмент кода:

Главная:

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); 

Mapper:

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

Разбавление:

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

Реализации карты и уменьшить функцию также выбрать из книга только. Но когда я пытаюсь выполнить этот код, то это ошибка, я получаю:

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 должен соответствовать входной функции карты. Поэтому я также попытался использовать 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)); 
    } 
} 

} 

ответ

2

Похоже, у вас есть неправильный класс Text импортируемого (javax.xml.soap.Text). Вы хотите org.apache.hadoop.io.Text

+0

Крис, я понятия не имею, где находится javax.xml.soap.Text. Я использую org.apache.hadoop.io.Text, и я не включил в код какой-либо другой сторонний баннер. – devj

+0

Вы проверили класс, содержащий метод main(), и проверили свой класс Mapper? Похоже, что исключение было брошено в картографе. Если вы все еще ищете, просто разместите весь класс Mapper, но сосредоточьтесь на объявленном типе того, что вы написали в контексте. –

+0

Спасибо Крис, я использовал javax.xml.soap.Text в моем основном методе. Оказалось. Изменение его на org.apache.hadoop.io.Text решило проблему. – devj

2

Вы автоматически импортировали неправильный импорт. Вместо импорта org.apache.hadoop.io.Text импортирован импорта javax.xml.soap.Text

Вы можете найти образец неправильного импорт в этом blog.

Смежные вопросы