mapreduce.job.user.classpath.first

一、问题描述

在一个MR中使用到了guava中的Range类用于合并不同数据中的vtime字段(时间区间)。在运行该MR时,将其打包成可执行jar包,使用hadoop jar XXX.jar方式运行。

可是,运行中段报错了,错误内容是:

1
2
Error:com.google.common.collect.Range.closed(Ljava/lang/Comparable;Ljava/lang/Comparable;)
Lcom/google/common/collect/Range;

二、解决方法

网上查找资料后,定位到问题的原因:MR运行时会从hadoop集群的CLASSPATH下寻找依赖的jar包,可是hadoop集群的CLASSPATH下没有guava包,而guava包在我打的可执行jar包中。

解决上面问题的方法是在mapred-site.xml文件中加入下列配置项:

1
2
3
4
<property>
<name>mapreduce.job.user.classpath.first</name>
<value>true</value>
</property>

该配置项设置后,hadoop集群在运行MR时会优先找用户的CLASSPATH。

在修改完mapred-site.xm文件后需要重启ResourceManager才能生效。