Привет, ребята, это может показаться маленьким детским вопросом, но я новичок в mapreduce
Я выполнял задание mapreduce, и у меня есть некоторые инструкции sysout на карте и уменьшаю стороны, чтобы увидеть, что происходит на карте и уменьшить стороны, но после завершения задания job.waitForCompletion()
возвращает false и не удалось выполнить работу
Я попытался отладить его, но не нашел ничего подозрительного, поэтому разместил здесь код
CustomKey.java
package com.example.secondarysort;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
public class CustomKey {
Text key = new Text();
IntWritable value = new IntWritable();
public void set(Text key,IntWritable value){
this.key = key;
this.value = value;
}
public Text getKey(){
return this.key;
}
public IntWritable getValue(){
return this.value;
}
}
SSDriver.java
package com.example.secondarysort;
import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
public class SSDriver {
private static class SSMapper extends Mapper<LongWritable, Text, CustomKey,NullWritable>{
CustomKey customKey = new CustomKey();
@Override
public void map(LongWritable key, Text value,Context context)
throws IOException, InterruptedException {
System.out.println(value);
StringTokenizer tokens = new StringTokenizer(value.toString());
customKey.set(new Text(tokens.nextToken()), new IntWritable(Integer.parseInt(tokens.nextToken())));
context.write(customKey, NullWritable.get());
}
}
private static class SSReducer extends Reducer<CustomKey, NullWritable, Text, IntWritable>{
@Override
public void reduce(CustomKey key, Iterable<NullWritable> values,Context context)
throws IOException, InterruptedException {
System.out.println(key.getKey()+" "+key.getValue());
context.write(key.getKey(), key.getValue());
}
}
public static void main(String[] args) throws IOException {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "secondary_sort");
job.setJarByClass(SSDriver.class);
job.setMapperClass(SSMapper.class);
job.setReducerClass(SSReducer.class);
job.setMapOutputKeyClass(CustomKey.class);
job.setMapOutputValueClass(NullWritable.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
TextInputFormat.addInputPath(job, new Path("data/data.txt"));
TextOutputFormat.setOutputPath(job, new Path("data/output"));
try {
System.out.println(job.waitForCompletion(true));
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Проблема в том, что вы используете пользовательский ключ CustomKey
который не реализует WritableComparable
интерфейс.
Обязательно, чтобы ваш пользовательский ключ реализовал его и предоставил определение для двух методов, таких как write()
и readFields()
. Важно также переопределить hashCode()
. Вы можете ссылаться на этот фрагмент кода для справки здесь
Надеюсь, поможет!