我正在使用 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/