2011-07-31 32 views
8

我試圖在Hadoop上運行MapReduce作業,但是我面臨錯誤,我不確定發生了什麼問題。我必須通過我的映射器需要的庫罐。hadoop中的-libjars問題

我excuting在終端上執行以下操作:

Hadoop的@ Ubuntu的:在/ usr /本地/ Hadoop的$斌/ Hadoop的罐子/home/hadoop/vardtst.jar -libjars /home/hadoop/clui.jar -libjars /home/hadoop/model.jar古滕貝格ou101

,我收到以下異常:

在java.net.URLClassLoader的$ 1.run(URLClassLoader.java:202)

是java .security.AccessController.doPrivileged(Native Method)

在java.net.URLClassLoader.findClass(URLClassLoader.java:190)

在java.lang.ClassLoader.loadClass(ClassLoader.java:306)

在java.lang.ClassLoader.loadClass( ClassLoader.java:247)

在java.lang.Class.forName0(本機方法)

在java.lang.Class.forName(Class.java:247)

在org.apache。 hadoop.util.RunJar.main (RunJar.java:149)

請幫助..Thanks

+1

我覺得'libjars'語法給你一個逗號分隔的列表,比如'-libjars jar1,jar2,jar3'。 [Generic Options](http://hadoop.apache.org/common/docs/r0.20.2/commands_manual.html#Generic+Options)參考。 –

+0

@Matt - 我仍然得到相同的錯誤 –

+0

檢查我的答案在這裏,我已經解釋了所有可用的選項來解決這個問題在這裏:http://stackoverflow.com/a/36227260/1766402 – Isaiah4110

回答

3

我找到了答案,它被扔的錯誤,因爲我是缺少在命令中的「主」類名。

執行正確的方法是: 的hadoop @ Ubuntu的:在/ usr /本地/ Hadoop的$斌/ Hadoop的罐子/home/hadoop/vardtst.jar VardTest -libjars /home/hadoop/clui.jar,/home/ hadoop/model.jar gutenberg ou101

其中VardTest是包含main()方法的類。

感謝

+7

這不適用於我在Hadoop 2.2 - Hadoop只是採取「-libjars」選項和jar路徑,並將其用作我的主類的參數。 – neuromouse

17

另外值得大家注意的微妙但重要的一點:指定運行分佈式地圖reduce任務的JVM和JVM上運行的客戶端的工作是非常不同的附加JAR文件的方式。

  • -libjars使罐僅適用於運行遠程地圖的JVM和降低任務

  • 爲了使這些相同的JAR的提供給客戶端JVM(當你運行的Hadoop jar命令所創建的JVM)需要設置HADOOP_CLASSPATH環境變量:

$ export LIBJARS=/path/jar1,/path/jar2 
$ export HADOOP_CLASSPATH=/path/jar1:/path/jar2 
$ hadoop jar my-example.jar com.example.MyTool -libjars ${LIBJARS} -mytoolopt value 

請參閱:http://grepalex.com/2013/02/25/hadoop-libjars/

錯誤-libjars行爲的另一個原因可能是自定義Job類的錯誤實現和初始化。

  • 作業類必須實現工具界面
  • 配置類的實例必須通過調用getConf()獲得的,而不是創建新實例;

參見:http://kickstarthadoop.blogspot.ca/2012/05/libjars-not-working-in-custom-mapreduce.html

+0

嗚呼,謝謝!將該jar添加到HADOOP_CLASSPATH中對我很有幫助。 – grinch

+0

'HADOOP_CLASSPATH'沒有辦法。升級到Hadoop 2後,'libjars'不是簡單的爲我工作。 – Swanand

3

當您正在使用Hadoop的jar命令指定-LIBJARS。首先,請確保您編輯驅動程序類,如下圖所示:

public class myDriverClass extends Configured implements Tool { 

     public static void main(String[] args) throws Exception { 
     int res = ToolRunner.run(new Configuration(), new myDriverClass(), args); 
     System.exit(res); 
     } 

     public int run(String[] args) throws Exception 
     { 

     // Configuration processed by ToolRunner 
     Configuration conf = getConf(); 
     Job job = new Job(conf, "My Job"); 

     ... 
     ... 

     return job.waitForCompletion(true) ? 0 : 1; 
    } 
} 

,如下圖所示現在編輯 「的Hadoop罐子」 命令:

Hadoop的罐子YourApplication.jar [myDriverClass] ARGS -libjars路徑/ to/jar/file

現在讓我們瞭解下面會發生什麼。基本上我們通過實現TOOL Interface來處理新的命令行參數。 ToolRunner用於運行實現Tool接口的類。它與GenericOptionsParser一起工作來解析通用hadoop命令行參數並修改工具的配置。在我們的Main()中,我們調用ToolRunner.run(new Configuration(),new myDriverClass(),args) - 在給定的給定解析後運行給定的Tool by Tool.run(String []),通用參數。它使用給定的配置,或者如果它爲空則構建一個配置,然後使用conf的可能修改版本設置工具的配置。

現在在run方法中,當我們調用getConf()時,我們得到配置的修改版本。 因此,請確保您的代碼中包含以下行。如果你實現了其他的一切,仍然使用Configuration conf = new Configuration(),沒有任何工作。

Configuration conf = getConf();

+0

@flexo:我編輯了答案以適應此問題的特定需求。 – Isaiah4110