【问题标题】:Classpath Issue类路径问题
【发布时间】:2023-03-16 07:45:01
【问题描述】:

我正在尝试运行 map/reduce 作业,但遇到 java.lang.NoSuchMethodError。我对此进行了一些研究,当我的代码执行(未编译)时会出现这种情况。编译期间存在正确版本的类和方法,但在尝试运行时,正确的方法不可用。导致此问题的 jar 文件是番石榴。我从打印的堆栈中知道这一点。尝试执行以下代码行时抛出错误:

ArrayDeque<Entry<String, String>> a = Queues.newArrayDeque();

这个 jar 是 hadoop 类路径的一部分,因为它带有我正在使用的 CDH 版本 5.3.0。我尝试将正确版本的番石榴添加到类路径中,但错误没有改变。我的问题如下:

  1. 我相信我已经正确识别了问题。你觉得这合理吗?我以前从未遇到过这个错误。

  2. 我认为我需要从类路径中删除旧版本的 guava 并添加新版本。但是,我真的不知道从哪里开始纠正这个问题。向 hadoop jar 发出的命令不包含旧版本的 guava(在 -libjar 参数中)。当我发出命令“hadoop 类路径”时,jar 是 hadoop 类路径的一部分。所以我假设有一些 hadoop 配置文件我可以编辑以使其消失。这是正确的方法吗,还是我需要做其他事情?

我正在使用 Java 7、CDH 5.3.0、NetBeans 8。

TIA

【问题讨论】:

  • 我的头顶 - 你能把新的 jar 放在类路径的最开始吗?
  • 据我所知,我可以通过在调用 Hadoop 时使用 -libjar 参数添加 jar 来将 jar 添加到类路径中。我使用它添加了罐子,并在最后添加了它。
  • 在那种情况下,你能不能试试这样:export HADOOP_CLASSPATH=/path/to/newjar.jar:$HADOOP_CLASSPATH;
  • 所以我在 bashrc 中设置了我的 CLASSPATH 和 HADOOP_CLASSPATH。我还关闭了所有终端并再次打开。番石榴罐甚至没有列出。我还重新启动了 Hadoop、YARN 和 Zookeeper。尽管如此,它并没有出现在 CLASSPATH 中的任何地方。我猜我的问题是如何设置默认的 hadoop 类路径?

标签: java hadoop classpath guava


【解决方案1】:

在我写这篇文章的时候,Hadoop 依赖于 Guava 版本 11.0.2。它在内部实现中大量使用了该库。

根据 Guava JavaDocs,Queues#newArrayDeque 方法是在 12.0 版本中添加的。如果您的代码编译成功,则意味着在构建时您的编译类路径中可以使用 Guava 12.0 或更高版本,但由于 Hadoop 在运行时提供了 11.0.2 版本,因此该方法不存在,导致 @987654322 @。

不幸的是,没有可靠的方法可以在 Hadoop 中换出不同的 Guava 版本。具体来说,我建议您不要尝试替换 Hadoop 发行版中附带的 Guava 11.0.2 jar。用不同的 Guava 版本替换它是未经测试的,它可能会破坏集群的稳定性。

更广泛的问题是 Hadoop 的依赖项“泄漏”给其客户端。 HADOOP-11656 是一个未实现的功能请求,它将 Hadoop 的内部依赖项与客户端隔离开来,以便您可以更轻松地在所需版本上使用像 Guava 这样的通用库。同时,在实现该功能之前,我认为您唯一的选择是坚持使用 Guava 11.0.2 API,或者可能尝试将您真正想要的一些 Guava 代码直接内联到您自己的项目中。 Queues#newArrayDeque is visible on GitHub的代码。

public static <E> ArrayDeque<E> newArrayDeque() {
  return new ArrayDeque<E>();
}

在这种特殊情况下,通过直接调用 java.util.ArrayDeque 构造函数来替换您的代码似乎很容易。多亏了 Java 7 的菱形运算符,它甚至不会更冗长。

ArrayDeque<Entry<String, String>> a = new java.util.ArrayDeque<>();

【讨论】:

    猜你喜欢
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2010-09-24
    相关资源
    最近更新 更多