2015-02-07 84 views
0

我已閱讀Using the libjars option with HadoopHadoop: Implementing the Tool interface for MapReduce driver,並且我已經按照博客執行了我的工作。如何讓Hadoop將jar部署到集羣?

我的地圖功能,減少在斯卡拉實施,並且效果很好,如果我收拾的Scala庫到使用Proguard的我的罐子。現在我想分開scala-library以便進一步減少我的jar大小。

我分開的Scala庫後,我跑這個命令:

HADOOP_ROOT_LOGGER=ALL,console hadoop jar /path/to/my.jar com.scala.mapreduce.Main -files /hdfs/path/to/scala-library.jar -libjars /hdfs/path/to/scala-library.jar /path/to/input /path/to/output 
  • 知道我是否需要-files選項
  • 我試圖改變路徑格式,包括file:///...,OS特定格式,HDFS格式

我表示Hadoop的錯誤不能找到的Scala庫

Exception in thread "main" java.lang.NoClassDefFoundError: scala/collection/immutable/StringOps ...

回答

0
  1. 不,你不需要-files選項
  2. 除了增加了libjars,還需要將標量庫添加到HADOOP_CLASSPATH中

以下是我們所做的添加MapReduce作業所需的附加JAR的操作。

HADOOP_CLASSPATH=$HADOOP_CLASSPATH:mylib.jar 
LIB_JARS=$(echo $HADOOP_CLASSPATH | sed -e "s/:/,/g") 
hadoop jar ... -libjars $LIB_JARS ... 

這對我們很有效。但是,我們有一個策略,只對環境瓶做這個(例如HCatalog,HBase等)。其他任何罐子都被包裝到我們的脂肪罐中。由於所有這些都在我們的防火牆之後,帶寬從來不是問題,所以我們不擔心罐子的大小。

+0

第二行意味着我應該包含所有必需的類路徑,而不僅僅是我自己的jar的類路徑,是嗎?...爲什麼文檔不會說 – davidshen84 2015-02-07 13:23:39

+0

您可能不需要包含所有的環境罐在libjars中...但這樣寫腳本更簡單,並且沒有任何傷害。如果更簡單,您可以將jar包括在libjars中並將其附加到HADOOP_CLASSPATH。我稍後可能會優化它。 – 2015-02-08 08:10:47