【问题标题】:How do I use a more recent version of a hadoop/lib jar in my map/reduce jobs?如何在我的 map/reduce 作业中使用更新版本的 hadoop/lib jar?
【发布时间】:2011-01-05 05:32:52
【问题描述】:
Hadoop 目前在其 lib 文件夹中附带 commons-httpclient-3.0.1.jar。
如果我有一个需要 commons-httpclient-3.1.jar 的 map/reduce 任务,将这个 jar 捆绑到我的 hadoop jar 的 lib 文件夹中似乎是不够的(就像使用任何普通的外部 jar 一样依赖项),因为 hadoop 似乎是从它的 lib 文件夹中加载前一个 jar,而不是使用我提供的那个。
不能使用不同版本的 jars,hadoop 也使用吗?
【问题讨论】:
标签:
jar
hadoop
classloader
【解决方案1】:
如果所有其他方法都失败了,请使用 maven-shade-plugin 重命名 commons-httpclient 的包,以便您拥有自己的,而 hadoop 拥有它。
【解决方案2】:
对于cdh4 hadoop版本,在hadoop配置对象中添加如下代码即可解决。
请注意,这将不会解决主代码(提交之前运行的代码)中的 jar hell,为了解决这个问题,我想我们应该添加 -D或者把它添加到hadoop配置文件中但是我还没有检查它
conf.set("mapreduce.task.classpath.user.precedence", "true");
conf.set("mapreduce.user.classpath.first", "true");
conf.set("mapreduce.job.user.classpath.first", "true");