Google AdSense (text)

hidden logo stop

Moving

거지 같은 이글루스 광고노출 정책이 싫어서,
새 보금자리(http://blog.leocat.kr/)로 이사감.

[Hadoop] wrong key class 오류 Computer & Program

어허~ wrong key class라는데.. 어디가 문제인지 모르겠다.

11/08/09 09:43:50 INFO mapred.JobClient: map 0% reduce 0%
11/08/09 09:44:00 INFO mapred.JobClient: Task Id : attempt_201108090850_0013_m_000000_0, Status : FAILED
java.io.IOException: wrong key class: class foo.bar.SomeClass is not class org.apache.hadoop.io.Text
    at org.apache.hadoop.mapred.IFile$Writer.append(IFile.java:164)
    at org.apache.hadoop.mapred.Task$CombineOutputCollector.collect(Task.java:880)
    at org.apache.hadoop.mapred.Task$NewCombinerRunner$OutputConverter.write(Task.java:1201)
    at org.apache.hadoop.mapreduce.TaskInputOutputContext.write(TaskInputOutputContext.java:80)
    at kr.bestbuyer.keyword.hadoop.wordCount.reducer.WordCountToDBReducer.reduce(WordCountToDBReducer.java:41)
    at kr.bestbuyer.keyword.hadoop.wordCount.reducer.WordCountToDBReducer.reduce(WordCountToDBReducer.java:1)
    at org.apache.hadoop.mapreduce.Reducer.run(Reducer.java:176)
    at org.apache.hadoop.mapred.Task$NewCombinerRunner.combine(Task.java:1222)
    at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.sortAndSpill(MapTask.java:1265)
    at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.flush(MapTask.java:1129)
    at org.apache.hadoop.mapred.MapTask$NewOutputCollector.close(MapTask.java:549)
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:623)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:305)
    at org.apache.hadoop.mapred.Child.main(Child.java:170)


Hadoop은 예외가 발생했을 때 좀 자세히 알려줬으면 좋겠다. key를 사용하는게 mapper도 있고, reducer도 있고, combiner도 있는데.. 어떤 key가 잘못 됐다는건지 말을 해줘야지 TㅅT 찾아보니 이 문제는 컴바이너 문제였다. 나도 아무 생각 없이 리듀서를 컴바이너로 사용했더니, 매퍼와 컴바이너의 output key가 달라서 발생한 문제다. 사실 컴바이너는 생각도 안 하고 있었는데.. =ㅅ=;;

job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
job.setOutputKeyClass(SomeClass.class);
job.setOutputValueClass(IntWritable.class);

job.setMapperClass(RecommQueryCountMapper.class);
job.setCombinerClass(WordCountToDBReducer.class); // 요녀석 output key가 달라 문제였다.
job.setReducerClass(WordCountToDBReducer.class);


좋은 습관을 위해서라도 려듀서와 컴바이너는 따로 만들어서 쓰는게 좋으려나.. 근데 왜 output key/value 클래스 지정에 컴바이너는 없을까?? @ㅅ@

덧글

댓글 입력 영역

Google AdSense (text/image)