2012-10-26 41 views
1

請幫忙,我卡住了。 這是我的代碼來運行作業。hadoop -libjars和ClassNotFoundException

hadoop jar mrjob.jar ru.package.Main -files hdfs://0.0.0.0:8020/MyCatalog/jars/metadata.csv -libjars hdfs://0.0.0.0:8020/MyCatalog/jars/opencsv.jar,hdfs://0.0.0.0:8020/MyCatalog/jars/gson.jar,hdfs://0.0.0.0:8020/MyCatalog/jars/my-utils.jar /MyCatalog/http_requests.seq-r-00000 /MyCatalog/output/result_file 

我得到這些警告說:

12/10/26 18:35:50 WARN util.GenericOptionsParser: The libjars file hdfs://0.0.0.0:8020/MyCatalog/jars/opencsv.jar is not on the local filesystem. Ignoring. 
12/10/26 18:35:50 WARN util.GenericOptionsParser: The libjars file hdfs://0.0.0.0:8020/MyCatalog/jars/gson.jar is not on the local filesystem. Ignoring. 
12/10/26 18:35:50 WARN util.GenericOptionsParser: The libjars file hdfs://0.0.0.0:8020/MyCatalog/jars/my-utils.jar is not on the local filesystem. Ignoring. 

然後:異常在線程「主要」 java.lang.NoClassDefFoundError: 在主階級路線,我嘗試從罐子類實例化名爲my-utils.jar

  1. 所有這些罐子都是hfds(我看見他們通過文件瀏覽器)
  2. 我-utils.jar確實含有類是的NoClassDefFoundError

我該怎麼辦錯的理由嗎?

UPD: 我檢查的源代碼GenericOptionsParser

/** 
    * If libjars are set in the conf, parse the libjars. 
    * @param conf 
    * @return libjar urls 
    * @throws IOException 
    */ 
    public static URL[] getLibJars(Configuration conf) throws IOException { 
    String jars = conf.get("tmpjars"); 
    if(jars==null) { 
     return null; 
    } 
    String[] files = jars.split(","); 
    List<URL> cp = new ArrayList<URL>(); 
    for (String file : files) { 
     Path tmp = new Path(file); 
     if (tmp.getFileSystem(conf).equals(FileSystem.getLocal(conf))) { 
     cp.add(FileSystem.getLocal(conf).pathToFile(tmp).toURI().toURL()); 
     } else { 
     LOG.warn("The libjars file " + tmp + " is not on the local " + 
      "filesystem. Ignoring."); 
     } 
    } 
    return cp.toArray(new URL[0]); 
    } 

所以: 1.逗號 2之間沒有空格還是不明白這一點......我試圖指向:本地文件系統,hdfs文件系統,結果是一樣的。似乎沒有添加類...

+0

還有這裏發佈的詳細答案:http://stackoverflow.com/questions/6890087/problem-with-libjars-in-hadoop –

回答

1

僅僅因爲它們在HDFS上,並不意味着它們位於正在運行的作業的類路徑中。

如果你真的只是想解決這個問題,我會使用maven來構建一個「胖罐子」,其中包含所有的依賴在一個jar中。你可以使用shade plugin來做到這一點。

但是,看着你的命令,它看起來是錯誤的。我認爲你可能使用-libjars,described here,使用「job」命令更好。我不確定你可以使用「hadoop jar」命令來指定外部罐子。

+0

我現在不能同意你的看法。 http://blog.cloudera.com/blog/2011/01/how-to-include-third-party-libraries-in-your-map-reduce-job/它在100%之前工作。然後我決定重構...或者我打破了某些問題,或者在Cloudera 4 – Sergey

+0

中存在一個錯誤,並且:從0.19開始,使用-libjars添加的jar也可以在客戶端 classpath中使用,也可以通過HADOOP-3570修復。 – Sergey

+0

這個錯誤幾乎總是在編譯時出現的jar文件出現,然後在運行時不存在。這幾乎肯定是一個類路徑問題 –

4

問題解決了。正確的調用是:

hadoop jar my-job.jar ru.package.Main -files /home/cloudera/uploaded_jars/metadata.csv -libjars /home/cloudera/uploaded_jars/opencsv.jar,/home/cloudera/uploaded_jars/gson.jar,/home/cloudera/uploaded_jars/url-raiting-utils.jar /MyCatalog/http_requests.seq-r-00000 /MyCatalog/output/scoring_result 

其中

/MyCatalog

是HDFS路徑,

/home/cloudera/uploaded_jars/

是當地FS路徑 的問題是在工作罐子。 以前我曾嘗試使用簡單罐子運行工作,只有三個類:Mapper,Reducer,Main類。 現在我確實提供了由maven生成的另一個(它生成其中兩個) 第二個作業jar包含所有依賴項庫。在裏面。結構如下所示: my-job。罐子

- LIB

- aopalliance-1.0.jar ASM-3.2.jar的Avro-1.5.4.jar ...公地的BeanUtils-1.7.0.jar公地beanutils- core-1.8.0.jar ... zookeeper-3.4.3-cdh4.0.0.jar

lib文件夾內有76個罐子。

它的工作原理,但我不明白爲什麼。

相關問題