2013-09-22 2 views
0

나는 실행하려고하는 putmerge라는 간단한 자바 프로그램을 가지고있다. 나는 6hrs를 위해 그것에이고, 웹에 많은 장소를 연구하고 그러나 해결책을 찾아 낼 수 없었다. 기본적으로 다음 명령을 사용하여 모든 클래스 라이브러리가있는 jar를 빌드하려고합니다.Hadoop Custom Java Program

javac -classpath *:lib/* -d playground/classes playground/src/PutMerge.java 

그런 다음 jar 파일을 다음 명령으로 빌드합니다.

jar -cvf playground/putmerge.jar -C playground/classes/ . 

그리고 나는 다음과 같은 명령을 실행하려고 :

bin/hadoop jar playground/putmerge.jar org.scd.putmerge "..inputPath.." "..outPath" 

... 그러나 나는이 간단한 항아리를 실행하는 모든 순열/조합을 시도

Exception in thread "main" java.lang.ClassNotFoundException: com.scd.putmerge 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
     at java.lang.Class.forName0(Native Method) 
     at java.lang.Class.forName(Class.java:270) 
     at org.apache.hadoop.util.RunJar.main(RunJar.java:153) 

, 나는 항상 위에 표시된 것처럼 예외를 얻으십시오.

내 소스 코드 :

package org.scd.putmerge; 

import java.io.IOException; 
import java.util.Scanner; 

import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.fs.FSDataInputStream; 
import org.apache.hadoop.fs.FSDataOutputStream; 
import org.apache.hadoop.fs.FileStatus; 
import org.apache.hadoop.fs.FileSystem; 

import org.apache.hadoop.fs.Path; 

/** 
* 
* @author Anup V. Saumithri 
* 
*/ 
public class PutMerge 
{ 
    public static void main(String[] args) throws IOException 
     { 
     Configuration conf = new Configuration(); 
     FileSystem hdfs = FileSystem.get(conf); 
     FileSystem local = FileSystem.getLocal(conf); 

     Path inputDir = new Path(args[0]); 
     Path hdfsFile = new Path(args[1]); 



     try 
     { 
      FileStatus[] inputFiles = local.listStatus(inputDir); 
      FSDataOutputStream out = hdfs.create(hdfsFile); 

      for(int i=0; i<inputFiles.length; i++) 
      { 
       System.out.println(inputFiles[i].getPath().getName()); 
       FSDataInputStream in = local.open(inputFiles[i].getPath()); 

       byte buffer[] = new byte[256]; 
       int bytesRead = 0; 
       while((bytesRead = in.read(buffer)) > 0) 
       { 
        out.write(buffer, 0, bytesRead); 
       } 
       in.close(); 
      } 
      out.close(); 
     } 
     catch(IOException ex) 
     { 
      ex.printStackTrace(); 
     } 
    } 
} 

답변

1

당신은 단지 내부에 PutMerge 클래스를 가하고 있습니다 방법이 약간 잘못되었을 수 있습니다.

을 수행하는 경우 코드 (org/scd/putmerge)의 패키지 (org.scd.putmerge)에 언급 된 경로에 PutMerge 클래스가 있어야합니다.

그렇지 않은 경우 다음을 수행하십시오. PutMerge.class를 org/scd/putmerge/디렉토리에 복사했는지 확인하십시오.

jar -cvf playground/putmerge.jar org/scd/putmerge/PutMerge.class 

다음에, 현재의 출력 org/scd/putmerge/PutMerge.clas 보이면 확인 jar tf putmerge.jar 다시 확인.

모두 정상이면 hadoop 병을 다시 실행할 수 있습니다. 그러나 오류를 살펴보면 실제로 PutMerge 클래스를 패키지에 포함시키지 않았 음을 알 수 있습니다. org.scd.putmerge.PutMerge을 사용해야합니다. 올바른 방법은 다음과 같아야합니다. -

bin/hadoop jar playground/putmerge.jar org.scd.putmerge.PutMerge "..inputPath.." "..outPath" 
+0

브릴리언트! 그게 내 문제를 해결해 줬어. 엄청 고마워. 레코드의 경우 bin/hadoop jar 명령 내 패키지 사양에 문제가 있습니다. 위에서 언급 한 것처럼 org.scd.putmerge.PutMerge로 바꿨습니다. – Ace