hadoop作业依赖与来自分布式的旧作业依赖冲突

wkftcu5l  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(306)

我正在使用hadoop-2.5.2linuxdistributive运行一个带有自定义shuffle插件的作业。mapper和reducer实现与其他依赖项一起打包到single.jar中
运行命令:

bin/hadoop -jar simple.jar

问题是mapper实现依赖于hamcrest 1.3,但是hadoop发行版附带了mockito all,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”。
没有运气。
任何暗示都将不胜感激。谢谢您!

6qqygrtg

6qqygrtg1#

你可以使用分布式缓存。hadoop框架将第三部分jar复制到所有tasktracker节点的本地磁盘。
“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,并创建一个包含所有依赖项的超级jar。

相关问题