我正在开发一个在亚马逊网络服务上运行的 mapreduce 程序(它实际上是一个相当复杂的字数算法)。我生成了一个在 AWS 节点上运行的 .jar。我现在正在做的是将所有 mapreduce 库 jar 合并到我的 .jar 文件中。一切正常,但我认为这不是一个很好的做法(他们对他们的机器映像进行了一些更新,我得到了可能与此相关的奇怪异常)。有人可以解释一下我如何自动链接亚马逊上安装的 hadoop 版本,这样我就可以在不将外部库添加到我的 jar 的情况下做到这一点?
非常感谢您的帮助!
我正在开发一个在亚马逊网络服务上运行的 mapreduce 程序(它实际上是一个相当复杂的字数算法)。我生成了一个在 AWS 节点上运行的 .jar。我现在正在做的是将所有 mapreduce 库 jar 合并到我的 .jar 文件中。一切正常,但我认为这不是一个很好的做法(他们对他们的机器映像进行了一些更新,我得到了可能与此相关的奇怪异常)。有人可以解释一下我如何自动链接亚马逊上安装的 hadoop 版本,这样我就可以在不将外部库添加到我的 jar 的情况下做到这一点?
非常感谢您的帮助!
所以你正在使用亚马逊的 Elastic MapReduce !?有不同的 ami 版本和不同的 hadoop 版本可用,请参阅http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/emr-plan-ami.html#emr-default-versions。
hadoop jars 本身+它的第 3 方依赖项(例如 commons-io)已经在您工作的类路径中。所以你是对的,如果你将 hadoop jar 与另一个版本捆绑到你的 job-jar 中,可能会出现问题。所以我想说你可以: - 确定你正在引导哪个 hadoop 版本(基于 ami-version) - 确定那个 hadoop 版本中使用的库是什么(检查正在运行的 ec2 实例或从apache 网站下载 hadoop 版本) - 再次编译正确的 hadoop 程序,并在捆绑 fat jar 时排除所有 hadoop 和 hadoops-3rd 方 jars