2013-09-22 37 views
0

我有一個簡單的java程序,名爲putmerge,我試圖執行。我一直在這裏工作了6個小時,在網上搜索了很多地方,但找不到解決方案。基本上,我嘗試用下面的命令所有類庫來構建JAR:Hadoop定製Java程序

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

然後我建立與下面的命令的罐子。

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類罐內的方式可能有點不正確。

如果您執行jar tf putmerge.jar,則必須在代碼(即org/scd/putmerge)中的包中提到的路徑(org.scd.putmerge)中看到PutMerge類。

如果不嘗試做以下事情來實現這一點。確保您已將PutMerge.class複製到org/scd/putmerge /目錄中。

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

接下來,jar tf putmerge.jar再次驗證檢查,如果現在看到在輸出org/scd/putmerge/PutMerge.clas秒。

如果一切正常,您可以嘗試再次運行hadoop jar。但看看這些錯誤,我發現你實際上並沒有將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