1

我想编写某种“引导”类,它将监视 MQ 的传入消息并将 map/reduce 作业提交给 Hadoop。这些作业大量使用一些外部库。目前我已经实现了这些作业,打包为带有 bin、lib 和 log 文件夹的 ZIP 文件(我使用 maven-assembly-plugin 将它们联系在一起)。

现在我想为 Mapper 和 Reducer 提供小型包装器,它们将使用现有应用程序的一部分。

据我所知,当提交作业时,Hadoop 会尝试查找具有映射器/减速器类的 JAR 文件,并将此 jar 通过网络复制到数据节点,该数据节点将用于处理数据。但不清楚如何告诉 Hadoop 复制所有依赖项?

我可以使用 maven-shade-plugin 创建一个带有作业和依赖项的 uber-jar,以及另一个用于引导的 jar(该 jar 将使用 hadoop shell-script 执行)。

请指教。

4

3 回答 3

2

一种方法是将所需的 jar 放入分布式缓存中。另一种选择是在 Hadoop 节点上安装所有必需的 jar,并告诉 TaskTracker 它们的位置。我建议你看一遍这篇文章。谈论同样的问题。

于 2013-07-08T19:02:53.933 回答
0

使用 hadoop 启动器脚本的 -libjars 选项来指定在远程 JVM 上运行的作业的依赖项;使用 $HADOOP_CLASSPATH 变量为在本地 JVM 上运行的 JobClient 设置依赖项

详细讨论在这里: http: //grepalex.com/2013/02/25/hadoop-libjars/

于 2013-10-23T14:29:51.527 回答
0

使用 maven 管理依赖关系并确保在构建和部署期间使用正确的版本。流行的 IDE 具有 maven 支持,因此您不必担心构建类路径以进行编辑和构建。最后,您可以指示 maven 构建一个包含您的应用程序和所有依赖项的单个 jar(“jar-with-dependencies”),使部署变得非常容易。

至于依赖项,例如hadoop,它们保证在运行时类路径中,您可以将它们定义为“提供”的范围,这样它们就不会包含在uber jar中。

于 2013-07-08T19:31:18.217 回答