hadoop에서 첫 번째 프로그램을 실행할 때이 예외가 발생합니다. (나는 0.20.2 버전에서 hadoop 새로운 API를 사용하고있다). 웹에서 검색 한 결과 대부분의 사람들이 MapperClass 및 ReducerClass를 구성 논리에 설정하지 않았을 때이 문제에 직면 한 것처럼 보였습니다. 하지만 확인하고 코드가 괜찮아 보이는군요. 누군가가 나를 도울 수 있다면 정말 감사 할 것입니다.Hadoop의 WordCount 프로그램에서 예외 가져 오기
java.io.IOException : 예상되는 org.apache.hadoop.io.Text에서 키의 형식이 일치하지 않습니다. org.apache.hadoop.io.LongWritable at org.apache.hadoop.mapred.MapTask $ MapOutputBuffer.collect (MapTask.java:871)
package com.test.wc;
import java.io.IOException;
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 WordCountMapper extends Mapper<LongWritable,Text,Text,IntWritable> {
public void Map(LongWritable key,Text value,Context ctx) throws IOException , InterruptedException {
String line = value.toString();
for(String word:line.split("\\W+")) {
if(word.length()> 0){
ctx.write(new Text(word), new IntWritable(1));
}
}
}
}
package com.test.wc;
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
public class WordCountReducer extends Reducer<Text,IntWritable,Text,IntWritable> {
public void reduce(Text key, Iterable<IntWritable> values, Context ctx) throws IOException,InterruptedException {
int wordCount = 0;
for(IntWritable value:values)
{
wordCount+=value.get();
}
ctx.write(key,new IntWritable(wordCount));
}
}
package com.test.wc;
import java.io.IOException;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class WordCountJob {
public static void main(String args[]) throws IOException, InterruptedException, ClassNotFoundException{
if(args.length!=2){
System.out.println("invalid usage");
System.exit(-1);
}
Job job = new Job();
job.setJarByClass(WordCountJob.class);
job.setJobName("WordCountJob");
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
job.setMapperClass(WordCountMapper.class);
job.setReducerClass(WordCountReducer.class);
//job.setCombinerClass(WordCountReducer.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
System.exit(job.waitForCompletion(true) ? 0:1);
}
}
'@ Override '주석을 넣으려고 했습니까? 당신의'map()'메쏘드는 대문자'M'을 가지며, 아마도 당신의 버전 대신에 디폴트'map()'이 사용될 것입니다. – Quetzalcoatl
@Quetzalcoatl 주석은 여러분이 겪고있는 문제입니다 - 기본지도 메소드는 신원 기능이며 동일한 입력 키/값 쌍을 출력합니다 -지도 메소드 이름을 소문자로 변경하고 메서드에'@Orride' 주석을 추가하십시오. –