У меня возникла проблема с моим первым кодом сокращения карты на 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));
}
}
}
Крис, я понятия не имею, где находится javax.xml.soap.Text. Я использую org.apache.hadoop.io.Text, и я не включил в код какой-либо другой сторонний баннер. – devj
Вы проверили класс, содержащий метод main(), и проверили свой класс Mapper? Похоже, что исключение было брошено в картографе. Если вы все еще ищете, просто разместите весь класс Mapper, но сосредоточьтесь на объявленном типе того, что вы написали в контексте. –
Спасибо Крис, я использовал javax.xml.soap.Text в моем основном методе. Оказалось. Изменение его на org.apache.hadoop.io.Text решило проблему. – devj