2012-09-02 3 views
0

나는 tcsh가 스크립트 파일을 실행하기 위해 하둡 스트리밍을 사용스크립트를 통해 Java 응용 프로그램을 실행 : java.lang.NoClassDefFoundError가

:

-- First copy the jar files to the Hadoop filesystem, 
    so that they are next to inputdir and outputdir. -- 
cp App/* /hadoop/jardir/ 

-- Run Hadoop -- 
hadoop jar /usr/lib/hadoop/contrib/streaming/hadoop-streaming-0.20.2-cdh3u4.jar \\ 
-D mapred.task.timeout=120000000 \\ 
-input "/hadoop/inputdir/" -output "/hadoop/outputdir/" \\ 
-mapper script.sh -reducer script.sh -file script.sh \\ 
-jobconf mapred.map.tasks=1 -jobconf mapred.reduce.tasks=0 >>& log.txt 

이 스크립트 파일은 다음과 같이 자바를 호출

Exception in thread "main" java.lang.NoClassDefFoundError: some/JavaApplication 
Caused by: java.lang.ClassNotFoundException: some.JavaApplication 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 
Could not find the main class: some.JavaApplication. Program will exit. 

:

java -cp /hadoop/jardir/SomeJavaApp.jar:/hadoop/jardir/* some.JavaApplication 

내가 명시 적으로 자바에게 클래스 경로를 말씀에도 불구하고, 실행은 실패 이미 Hadoops -libjars 매개 변수를 설정하는 것과 같은 다양한 제안을 시도했지만 도움이되지 않았습니다.

Hadoop Streaming을 사용할 때 스크립트를 통해 Java 응용 프로그램을 실행하려면 어떻게해야합니까?

답변

2

난 당신의 항아리가 분산 캐시에 복사되지 않는다고 생각합니다. -files 옵션을 통해 쉘 스크립트와 함께 항아리를 배송하십시오. 예컨대 :

hadoop jar /home/user/hadoop-distrib/lib/hadoop-streaming.jar \ 
    -files runjava.sh,hadooptest.jar \ 
    -D mapreduce.job.reduces=0 \ 
    -D mapred.job.name=TestJob \ 
    -input /user/hadoop/test \ 
    -output /user/hadoop/test/res \ 
    -mapper 'runjava.sh' 

난 당신이 hadooptest.jarrunjava.sh이 저장된 디렉토리에서 스트리밍 작업을 실행한다고 가정합니다.

runjava.sh :

java -cp /home/user/test/hadooptest.jar:/home/user/hadoop-distrib/lib/* com.example.hadooptest.StreamTest 


StreamTest.java :

... 
public class StreamTest { 

    public static void main(String[] args) throws Exception { 

     BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
     String s = null; 
     while ((s = in.readLine()) != null && s.length() != 0) { 
      System.out.println(s); 
     } 
    } 
} 

이 예는 버전 0.20 - APPEND - r1056497에 잘 작동합니다.

관련 문제