2012-06-23 2 views
1

두 개의 노드 (마스터/슬레이브 및 슬레이브)로 구성된 hadoop 클러스터에서 샘플 Map/Reduce 작업을 빌드 중입니다. 다음은 내 사양은 다음과 같습니다Hadoop MapReduce 작업 입력 파일 ClassNotFound

$HADOOP_HOME = /usr/local/hadoop 
My M/R classfiles path = $HADOOP_HOME/MyMapRed_classes 
My Mapper classfile = $HADOOP_HOME/MyMapRed_classes/MyMapper 
My Reducer classfile = $HADOOP_HOME/MyMapRed_classes/MyReducer 
My Jar path = $HADOOP_HOME/MyMapred/MyMapRed.jar 
My HDFS Input Path = /user/hadoop/MyMapRed/inputfile 
My HDFS Output Path = /user/hadoop/MyMapRed_output 

<myusername>@localhost:/usr/local/hadoop$ bin/hadoop jar $HADOOP_HOME/MyMapRed/MyMapRed.jar -input /user/hadoop/MyMapRed/inputfile -output /user/hadoop/MyMapRed_output/ -mapper $HADOOP_HOME/MyMapRed_classes/MyMapper -reducer $HADOOP_HOME/MyMapRed_classes/MyReducer 

을 다음과 같이 나는 M/R 작업을 실행하고 있습니다 그러나 메시지

아래로 분명 입력 파일을 찾을 수없는 것 같다
Exception in thread "main" java.lang.ClassNotFoundException: -input 
at java.net.URLClassLoader$1.run(URLClassLoader.java:217) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:205) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:321) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:266) 
at java.lang.Class.forName0(Native Method) 
at java.lang.Class.forName(Class.java:264) 
at org.apache.hadoop.util.RunJar.main(RunJar.java:149) 

다음은 현재 사용중인 MyMapRed 클래스입니다. 입력으로 쌍 목록이 있습니다. 감속기는 그룹당 평균 Val을 제공해야합니다.

import java.io.IOException; 
import java.util.Iterator; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.DoubleWritable; 
import org.apache.hadoop.io.Text; 

import org.apache.hadoop.mapred.FileInputFormat; 
import org.apache.hadoop.mapred.FileOutputFormat; 
import org.apache.hadoop.mapred.MapReduceBase; 
import org.apache.hadoop.mapred.Mapper; 
import org.apache.hadoop.mapred.OutputCollector; 
import org.apache.hadoop.mapred.Reducer; 
import org.apache.hadoop.mapred.Reporter; 
import org.apache.hadoop.mapred.JobClient; 
import org.apache.hadoop.mapred.JobConf; 
import org.apache.hadoop.mapred.TextInputFormat; 
import org.apache.hadoop.mapred.TextOutputFormat; 


public class MyMapRed { 

public static class MyMapper extends MapReduceBase 
implements Mapper<Text, Text, Text, DoubleWritable> { 

    private final static Text Group = new Text(); 
    private final static DoubleWritable Val = new DoubleWritable(); 

    public void map(Text key, Text value, OutputCollector<Text, DoubleWritable> output, Reporter reporter) 
     throws IOException { 
     String line = value.toString(); 
     String[] KeyAndVal = line.split("\t",2); 
     Group.set(KeyAndVal[0]); 
     Val.set(Double.valueOf(KeyAndVal[1])); 
     output.collect(Group, Val); 
    } 
} 

public static class MyReducer extends MapReduceBase 
implements Reducer<Text, DoubleWritable, Text, DoubleWritable> { 
    public void reduce(Text key, Iterator<DoubleWritable> values, 
      OutputCollector<Text, DoubleWritable> output, Reporter reporter) 
      throws IOException { 
     DoubleWritable val = new DoubleWritable(); 
     double valSum = 0.0; 
     int valCnt = 0; 
     while (values.hasNext()) { 
      val = values.next(); 
      valSum += val.get(); 
      valCnt++; 
     } 
     if (valCnt>0) 
      valSum = valSum/valCnt; 
     output.collect(key, new DoubleWritable(valSum)); 
    } 
} 


public static void main(String[] args) { 
    JobClient client = new JobClient(); 
    JobConf conf = new JobConf(MyMapRed.class); 
    conf.setJobName("MyMapRed"); 

    conf.setOutputKeyClass(Text.class); 
    conf.setOutputValueClass(DoubleWritable.class); 

    conf.setMapperClass(MyMapper.class); 
    conf.setReducerClass(MyReducer.class); 

    conf.setInputFormat(TextInputFormat.class); 
    conf.setOutputFormat(TextOutputFormat.class); 

    FileInputFormat.addInputPath(conf, new Path("input")); 
    FileOutputFormat.setOutputPath(conf, new Path("output")); 

    client.setConf(conf); 

    try { 
     JobClient.runJob(conf); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 
} 

아무도 내가 제기 한 ClassNotFoundException에 대해 누락 된 부분을 제안 할 수 있습니까?

+1

은 당신의 맵퍼 및 감속기는 자바 코드로 작성되어 Java로 작성된 경우 필요하지 않습니다 스트리밍을 사용하려고 시도하는 것 같아? 그렇다면 왜 스트리밍을 사용하려고합니까? –

+0

예, Java를 사용하고 있습니다. 현재 이클립스 3.5.2 (Galileo)를 사용하고 있으며 이클립스에서 하둡에서 MR 작업을 실행할 방법이 없습니다. 나는 hadoop-common-project (SVN link : http://svn.apache.org/repos/asf/hadoop/common/trunk/hadoop-common-project/)를 빌드하기 위해 Maven을 통합하려고 시도했다. MR 직장에서 이클립스지만 내가 어제 다른 스레드 링크 http://stackoverflow.com/questions/11164370/maven-archetypegenerate-failure-caused-by-org-apache-maven-plugin-mojofailureex에 게시 오류가 발생했습니다. 확인하려면 스트리밍을 사용하여 M/R이 실제로 작동하는지 확인하십시오. – somnathchakrabarti

답변

3

MapRed.jar 파일에 jars manifest에 정의 된 주 클래스가없는 경우 hadoop은 jar 뒤에 인수가 정적 main 메소드를 포함하는 클래스가 될 것으로 기대합니다.

메인 클래스 (public static void main(String args[]) 메소드를 포함하고 JobConf 또는 Job 클래스를 통해 작업을 구성하는 클래스)의 이름을 지정해야합니다.

는 경우, 또한 당신의 맵퍼 및 감속기가

+0

Hadoop에서 실행되도록 런타임 환경을 구성 할 수있는 방법이 있습니까? 나는 어제 연구를했고 Eclipse 프로젝트에서 MR 프로젝트를 생성하기 위해 $ {eclipse.home}/plugins/디렉토리 아래에 $ {version} -eclipse-plugin.jar이 필요하다는 것을 알게되었다. $ {eclipse.home}은 일] 적으로/usr/lib/eclipse /이며이 경로는 $ HADOOP_HOME/src/contrib/eclipse-plugin/build.properties에 대한 항목 eclipse.home =/usr/lib/eclipse/Hadoop은 모든 MR 작업을 작성/컴파일하는 동안 eclipse home을 인식합니다. 따라서 양방향 프로세스와 같습니다. – somnathchakrabarti

+0

스트리밍과 일반지도/축소의 차이점에 대해서는 잘 모르겠습니다. 내 위의 덧글 이외에, 당신은 좀 더 정교한 pls 수 있습니까? – somnathchakrabarti

+0

Mapper/Reducer 클래스의 세부 정보를 JobConf 세부 정보와 함께 추가했습니다. – somnathchakrabarti

관련 문제