【发布时间】: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。我尝试将正确版本的番石榴添加到类路径中,但错误没有改变。我的问题如下:
我相信我已经正确识别了问题。你觉得这合理吗?我以前从未遇到过这个错误。
我认为我需要从类路径中删除旧版本的 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