我想写一些“bootstrap”类,它将监视MQ的传入消息并将map / reduce作业提交给Hadoop。这些工作大量使用一些外部库。目前我已经实现了这些作业,打包为包含bin,lib和日志文件夹的ZIP文件(我正在使用maven-assembly-plugin将各种内容绑定在一起)。
现在我想为Mapper和Reducer提供小包装器,它将使用现有应用程序的一部分。
据我所知,当提交作业时,Hadoop会尝试查找具有mapper / reducer类的JAR文件,并将此jar通过网络复制到数据节点,该节点将用于处理数据。但目前尚不清楚如何告诉Hadoop复制所有依赖项?
我可以使用maven-shade-plugin创建一个带有作业和依赖项的超级jar,另一个用于bootstrap的jar(这个jar将用hadoop shell脚本执行)。
请建议。
答案 0 :(得分:1)
一种方法是将所需的jar放入分布式缓存中。另一种方法是在Hadoop节点上安装所有必需的jar,并告诉TaskTrackers他们的位置。我建议你仔细阅读post一次。谈论同样的问题。
答案 1 :(得分:0)
使用maven管理依赖项并确保在构建和部署期间使用正确的版本。流行的IDE有maven支持,因此您不必担心为编辑和构建构建类路径。最后,您可以指示maven构建一个包含您的应用程序和所有依赖项的jar(" jar-with-dependencies"),使部署变得非常简单。
对于依赖项,例如hadoop,它们保证在运行时类路径中,你可以使用"提供的"范围来定义它们。所以他们没有被包括在超级罐中。
答案 2 :(得分:0)
使用hadoop启动程序脚本的-libjars选项指定在远程JVM上运行的作业的依赖关系; 使用$ HADOOP_CLASSPATH变量来设置在本地JVM上运行的JobClient的依赖关系