2013-11-04 4 views
2

WordCount map/reduce 작업의 모범 코드를 실행하려고합니다. Hadoop 1.2.1에서 실행 중입니다. 저는 Eclipse에서 실행하고 있습니다. 여기에 내가 실행하려고 코드입니다 :Eclipse에서 WordCount 예제를 실행할 때 ClassNotFoundException이 발생합니다.

13/11/04 13:27:53 INFO mapred.JobClient: Task Id : attempt_201310311611_0005_m_000000_0, Status : FAILED java.lang.RuntimeException: java.lang.ClassNotFoundException: com.rf.hadoopspikes.WordCount$Map at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:857) at org.apache.hadoop.mapreduce.JobContext.getMapperClass(JobContext.java:199) at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:718) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:364) at org.apache.hadoop.mapred.Child$4.run(Child.java:255) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:415) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1190) at org.apache.hadoop.mapred.Child.main(Child.java:249)

내가 WordClass 찾을 수 없음을 이해하지만 난 방법을 몰라 :

package mypackage; 

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.Text; 
import org.apache.hadoop.mapreduce.Job; 
import org.apache.hadoop.mapreduce.Mapper; 
import org.apache.hadoop.mapreduce.Reducer; 
import org.apache.hadoop.mapreduce.Reducer.Context; 
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat; 
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat; 


public class WordCount { 

    public static class Map extends 
      Mapper<LongWritable, Text, Text, IntWritable> { 
     private final static IntWritable one = new IntWritable(1); 
     private Text word = new Text(); 

     public void map(LongWritable key, Text value, Context context) 
       throws IOException, InterruptedException { 
      String line = value.toString(); 
      StringTokenizer tokenizer = new StringTokenizer(line); 
      while (tokenizer.hasMoreTokens()) { 
       word.set(tokenizer.nextToken()); 
       context.write(word, one); 
      } 
     } 
    } 

    public static class Reduce extends 
      Reducer<Text, IntWritable, Text, IntWritable> { 

     public void reduce(Text key, Iterable<IntWritable> values, 
       Context context) throws IOException, InterruptedException { 
      int sum = 0; 
      for (IntWritable val : values) { 
       sum += val.get(); 
      } 
      context.write(key, new IntWritable(sum)); 
     } 
    } 

    public static void main(String[] args) throws Exception { 
     Configuration conf = new Configuration(); 
     conf.set("mapred.job.tracker", "maprfs://,y_address"); 
     conf.set("fs.default.name", "hdfs://my_address"); 

     Job job = new Job(conf, "wordcount"); 
     job.setJarByClass(WordCount.class); 

     job.setOutputKeyClass(Text.class); 
     job.setOutputValueClass(IntWritable.class); 

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

     job.setInputFormatClass(TextInputFormat.class); 
     job.setOutputFormatClass(TextOutputFormat.class); 

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

     job.waitForCompletion(true);  
    } 
} 

을 Unfortunatelly는이 코드를 실행하면 다음과 같은 오류와 함께 종료 이 일을하라. 아이디어가 있으십니까?

+0

이것은 대개 종속성 문제이므로 클래스 com.rf를 포함하는 여러 버전의 jar 파일을 가지고있을 수 있습니다 .hadoopspikes.WordCount $ Map' 클래스 패스 또는 jar 버전이 코드 샘플과 호환되지 않습니다 (기본 메소드 시작시 설정 한 옵션이 사용자 버전에서 작동하지 않을 수 있음) –

답변

0

Eclipse에서 직접 실행하는 경우 클래스가 Jar 파일에 번들되어 있는지 확인해야합니다 (hadoop에서 HDFS로 복사). 오류는 Jar 파일이 빌드되지 않았거나 런타임에 클래스가 번들 된 jar 파일이 아닌 출력 디렉토리에서 실행된다는 사실과 관련이 있습니다.

클래스를 jar 파일로 보내고 내보내고 해당 Jar 파일에서 WordCount 클래스를 실행하십시오. Eclipse Hadoop 플러그인을 사용하면이 모든 것을 처리 할 수 ​​있다고 생각할 수도 있습니다. 최종 옵션은 항아리를 번들로 만든 다음 명령 줄에서 실행하는 것입니다 (다양한 Hadoop 튜토리얼에 설명 된대로)

+0

Hadoop에서 코드를 실행하려면 먼저 클래스를 jar 파일에 넣어야합니까? 이렇게하면 코드를 테스트 할 때마다 jar 파일을 만들어야 할 경우 map-reduce 응용 프로그램 개발 프로세스에 약간의 부담이 가중됩니다. – Jakub

+0

예. 클래스를 배포 가능한 jar 파일로 묶어야합니다. 그리고 hadoop은 그것이 전달해야하는 클래스를 추측 할 수 없습니다. 테스트에는 코드를 테스트 할 수있는 다른 메소드가 있습니다. MRUnit과 LocalJobRunner를 사용하는 것은 두 가지입니다. –

+0

감사합니다! 나는 그것을 염두에 두겠다. – Jakub

관련 문제