java - Hadoop 工作依赖性与分布式的旧工作依赖性发生冲突

标签 java hadoop classpath

我正在使用 hadoop-2.5.2 linux distributive 来运行带有自定义 Shuffle 插件的作业。 Mapper 和 Reducer 实现与其他依赖一起打包到 single.jar 中

使用命令运行:

bin/hadoop -jar simple.jar

问题是 Mapper 实现依赖于 hamcrest 1.3,但 Hadoop 分发版随 mockito-all 一起提供,其中包含较旧的匹配器(来自 hamcrest 1.1)。 因此,在作业运行期间,我得到了:

java.lang.NoSuchMethodError(org.hamcrest.core.AnyOf.anyOf(Lorg/hamcrest/Matcher;Lorg/hamcrest/Matcher;)Lorg/hamcrest/core/AnyOf;)
out of org.hamcrest.Matchers#anyOf[133]

因此,AnyOf.class 是从 “hadoop-2.5.2/share/hadoop/common/lib/mockito-all-1.8.5.jar”

很明显,首先要说的是Hadoop加载用户库。 我尝试了两种方法:

1) 将“mapreduce.job.classloader”设置为“true”

2) 将“mapreduce.job.user.classpath.first”设置为“true” 既有又分别。

没有运气。

任何提示将不胜感激。 谢谢!

最佳答案

您可以使用分布式缓存。 hadoop 框架将第三方 jar 复制到所有任务跟踪器节点的本地磁盘。

“该 jar 将被放置在分布式缓存中,并将可供所有作业的任务尝试使用。” http://blog.cloudera.com/blog/2011/01/how-to-include-third-party-libraries-in-your-map-reduce-job/

所以你可以使用,例如:

hadoop jar my-example.jar -libjars mockito-correct-version.jar

您还可以在 hadoop jar 中包含 mockito jar,并创建一个包含所有依赖项的 super jar。

关于java - Hadoop 工作依赖性与分布式的旧工作依赖性发生冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32359787/

相关文章:

java - Java Web 应用程序中的 Quartz 与 ScheduledExecutorService

java - 在 gradle 中运行应用程序所需的模块文件

java - Text-Adventure 在某一行后意外停止。

java - 使用 JodaTime 获取错误的天数

java - "Error: Could not find or load main class org.apache.hadoop.util.RunJar"是什么?

java - 如何解决 ClassNotFoundException?

在 Weka 中以编程方式使用 LibSVM 的 java 类路径错误

java - 为什么 Hadoop API FSDataInputStream 读取小于缓冲区大小?

hadoop - Hdfs 可以有不同的复制策略吗

java - 如何让第3方应用程序使用logback.xml?