2015-02-07 85 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