2013-06-15 1 views
1

Я пытался запустить вариант примера WordCount, вариант, Mapper выводит текст как ключ и текст как значение, а выходы редуктора Текст как ключ и NullWritable как значение.hasoop mapreduce job does not run reducer

Кроме карты, сократить подписи, я поставил основной метод, как это:

//start a conf 
Configuration conf = new Configuration(); 
conf.set("str",str); 

//initialize a job based on the conf 
Job job = new Job(conf, "wordcount"); 
job.setJarByClass(org.myorg.WordCount.class); 

//the reduce output 
job.setOutputKeyClass(Text.class); 
job.setOutputValueClass(NullWritable.class); 

//the map output 
job.setMapOutputKeyClass(Text.class); 
job.setMapOutputValueClass(Text.class); 

//Map and Reduce 
job.setMapperClass(Map.class); 
job.setReducerClass(Reduce.class); 


//take hdfs locations as input and output 
job.setInputFormatClass(TextInputFormat.class); 
job.setOutputFormatClass(TextOutputFormat.class); 

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

//run the job 
job.waitForCompletion(true); 

Для отладки, я поставил функцию карты в качестве

map(LongWritable key, Text value, Context context){ 
......... 
context.write("1000000","2"); 
} 

и уменьшить код,

reduce(Text key, Iterable<Text> values, Context context){ 
....... 
context.write("v",NullWritable.get()); 
} 

Однако все то, что я вижу на выходе, является выходом карты. Редуктор компилируется, но даже не называется! Я считаю, что может быть что-то недостающее в методе main(), код которого описан, но что осталось? Я не вижу, какая информация необходима для конфигурации Job.

спасибо,

ответ

3

Попробуйте добавить @override к функции снижения, чтобы убедиться, что на самом деле перекрывая поведение. Если ваша подпись не соответствует, то она будет использовать сокращение по умолчанию, которое ничего не делает. Вы получите ошибку компилятора, если вы не будете правильно переопределять.

@override 
reduce(Text key, Iterable<Text> values, Context context){ 
....... 
context.write("v",NullWritable.get()); 
} 
+2

'' v "' также не относится к типу Текст, он должен быть написан как 'new Text (" v ")'. Его картограф имеет ту же проблему, что и путаница 'long' со строкой. –

+0

«v» часть была второй версией моей дикой попытки сделать редуктор работать, но я согласен ... спасибо за указание :) – user2325080

+0

проблема решена :) большое спасибо – user2325080

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