【问题标题】:Hadoop library conflict at mapreduce timemapreduce 时的 Hadoop 库冲突
【发布时间】:2012-09-21 18:27:27
【问题描述】:

我有一个使用 Hadoop API 启动各种远程 mapreduce 作业的 jar(即,我不使用命令行来启动作业)。执行各种作业的服务 jar 是使用 maven 的“jar-with-dependencies”构建的。

除了使用 commons-codec 1.7 的作业外,我的作业都运行良好,我得到:

致命的 org.apache.hadoop.mapred.Child:运行子错误:java.lang.NoSuchMethodError:org.apache.commons.codec.binary.Base64.encodeAsString([B)Ljava/lang/String;

我认为这是因为我的 jar 包含 commons-codec 1.7 而我的 Hadoop 安装的 lib 包含 commons-codec 1.4 ...

他们有什么方法可以指示 Hadoop 使用分布式 commons-codec 1.7(我假设这是作为作业依赖项分发的)而不是 hadoop 1.0.3 核心库中的 commons-codec 1.4?

非常感谢!

注意:从我的 Hadoop 库文件夹中删除 commons-codec-1.4.jar 确实解决了问题,但似乎不太理智。希望有更好的选择。

【问题讨论】:

    标签: java maven hadoop


    【解决方案1】:

    两种方法:

    • 您应该能够从 hadoop 依赖项中排除 commons-codec,并为 commons-codec 添加另一个显式依赖项
    • 尝试将范围设置为提供,以便不包含任何 hadoop jar。这假定这些 jar 将位于运行时类路径中。

    【讨论】:

    • 感谢您的回答,不是 100% 确定您对第一点和第二点的意思,我在 pom 中的 hadoop 客户端库已经设置为提供的范围。
    • 在 pom 的依赖块中,您可以列出许多应从 maven 操作中排除的隐含依赖项。因此,如果 1.4 版本是间接隐含的版本,您可以排除它并在您的 pom 中明确包含 1.7 的新依赖项。
    • 是的,这已经完成了。 commons-codec 1.7 被添加到 pom 中,并提供了 hadoop 库。问题是当 hadoop 在将我的 jar 分发到作业跟踪器后进入 MR 时。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-11
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 2015-04-07
    相关资源
    最近更新 更多