Hadoop-提交具有大量依赖项(jar文件)的作业

Hadoop-提交具有大量依赖项(jar文件)的作业,hadoop,Hadoop,我想编写某种“bootstrap”类,它将监视MQ中的传入消息,并向Hadoop提交map/reduce作业。这些作业大量使用一些外部库。目前,我已经实现了这些作业,打包为带有bin、lib和log文件夹的ZIP文件(我正在使用maven assembly插件将它们联系在一起) 现在,我想为Mapper和Reducer提供一些小包装,它们将使用现有应用程序的一部分 据我所知,当提交作业时,Hadoop会尝试找出包含mapper/reducer类的JAR文件,并通过网络将该JAR复制到数据节点,该

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

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

据我所知,当提交作业时,Hadoop会尝试找出包含mapper/reducer类的JAR文件,并通过网络将该JAR复制到数据节点,该节点将用于处理数据。但不清楚如何告诉Hadoop复制所有依赖项

我可以使用maven shade插件创建一个包含作业和依赖项的uber jar,以及另一个用于引导的jar(该jar将使用hadoop shell脚本执行)


请给出建议。

一种方法是将所需的JAR放入分布式缓存中。另一种选择是在Hadoop节点上安装所有必需的JAR,并告诉TaskTracker它们的位置。我建议你再做一次。讨论相同的问题。

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


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

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


详细的讨论在这里:

这里有详细的答案: