Google AdSense (text)

hidden logo stop

Moving

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

[Hadoop] Mapper/Reducer를 찾지 못 할 때 - NoSuchMethodException Computer & Program

Hadoop 예제가 잘 됐었는데.. 어제 뭔가를 손댔는데 동작하지 않는다. 그런데 하루가 지나지도 않았는데 그 뭔가가 기억이 나지 않는다. (이럴 때가 제일 난감 TㅅT)

해당 클래스와 생성자(hadoopSite.WordCount$Map.<init>())가 분명히 있는데 아래처럼 NoSuchMethodException을 뱉으며 실행이 되지 않는다. 흠.. 있는데도 못 찾는 원인이 뭘까??

$ hadoop jar HadoopSiteExample.jar hadoopSite.WordCount wordcount/input wordcount/output
11/04/28 11:19:20 INFO input.FileInputFormat: Total input paths to process : 2
11/04/28 11:19:20 INFO mapred.JobClient: Running job: job_201104281048_0001
11/04/28 11:19:21 INFO mapred.JobClient: map 0% reduce 0%
11/04/28 11:19:30 INFO mapred.JobClient: Task Id : attempt_201104281048_0001_m_000000_0, Status : FAILED
java.lang.RuntimeException: java.lang.NoSuchMethodException: hadoopSite.WordCount$Map.<init>()
        at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:115)
        at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:569)
        at org.apache.hadoop.mapred.MapTask.run(MapTask.java:305)
        at org.apache.hadoop.mapred.Child.main(Child.java:170)
Caused by: java.lang.NoSuchMethodException: hadoopSite.WordCount$Map.<init>()
        at java.lang.Class.getConstructor0(Class.java:2706)
        at java.lang.Class.getDeclaredConstructor(Class.java:1985)
        at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:109)
        ... 3 more



역시 구글 신님은 뭐든지 알고 계셔 =ㅅ=;;
Re: NoSuchMethodException when running Map Task
하둡의 Mapper와 Reducer를 inner class로 만들면 꼭 static 클래스로 만들어야 한다. (사실 inner class는 꼭 필요한 경우가 아니면 안 쓰는게 좋다. 알아보기도 힘들고 이렇게 접근도 어렵다.)

예제가 inner class로 Mapper와 Reducer가 만들어져 있었는데, 왜 클래스를 static 클래스로 만들었을까 하는 궁금증에 static을 제거 해 봤던 것이다. 전체 예제는 MapReduce Tutorial (http://hadoop.apache.org/mapreduce/docs/current/mapred_tutorial.html)에서 볼 수 있고, 아래는 이 내용에 맞는 부분만 적어본다.
public class WordCount extends Configured implements Tool
{
    public static class Map extends Mapper <LongWritable, Text, Text, IntWritable>
    {
        public void map(LongWritable key, Text value, Context context)
        {
            ...
        }
    }

    public static class Reduce extends Reducer <Text, IntWritable, Text, IntWritable>
    {
        public void reduce(Text key, Iterable <IntWritable> values, Context context)
        {
            ...
        }
    }

    public int run(String [] args)
    {
        ...
    }
}



inner class를 static 클래스로 만들지 않으면 다음과 같은 방식으로 객체를 생성할 수 없다.
WordCount.Map map = new WordCount.Map();
WordCount.Reduce reduce = new WordCount.Reduce();

inner class가 static이 아니면 아래와 같이 outer class인 WordCount의 객체를 먼저 생성하고, 그 객체를 통해서 inner class에 접근할 수 있다.
WordCount wordCount = new WordCount();
WordCount.Map map = wordCount.new Map();
WordCount.Reduce reduce = wordCount.new Reduce();


위의 에러 스택을 보면 reflection으로 객체를 생성하는데, 위와 같은 객체 생성 방식의 차이로 인해서 객체가 생성되지 못 한 것 같다.


+ 아~~ 하둡.. 알다가도 어려워 TㅅT

덧글

댓글 입력 영역

Google AdSense (text/image)