如何让Hadoop部署jar到集群?

How to let Hadoop deploy jars to the cluster?

我已阅读Using the libjars option with Hadoop and Hadoop: Implementing the Tool interface for MapReduce driver,我已关注博客以实现我的作业运行程序。

我的 map reduce 函数是在 Scala 中实现的,如果我使用 Proguardscala-library 打包到我的 jar 中,效果很好。现在我想分离 scala-library 以进一步减小我的 jar 大小。

在我分离 scala-library 之后,我 运行 这个命令:

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

我得到的错误表明 hadoop 找不到 scala-library:

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

  1. 不,您不需要 -files 选项
  2. 除了添加到 libjars 之外,您还需要将 scala 库添加到 HADOOP_CLASSPATH

这是我们添加 MapReduce 作业所需的额外 jar 的方法。

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

这对我们来说效果很好。但是,我们的政策是只对环境 jar(例如 HCatalog、HBase 等)执行此操作。任何其他罐子都被包装到我们的胖罐子里。由于所有这些都在我们的防火墙后面,带宽从来都不是问题,所以我们不用担心 jars 的大小。