java.lang.NoClassDefFoundError: org/apache/hadoop/mapreduce/JobContext

开始报错

java.lang.NoClassDefFoundError: org/apache/hadoop/mapreduce/JobContext

JobContext在Hive-exec里面有,所以觉得很奇怪说class not found 。java.lang.NoClassDefFoundError两种原因。

1.这个jar包确实没有。导入。

2.依赖包有冲突。导致无法加载。这个冲突的包,有可能是这个找不到类所属的jar包。也有可能是函数调用时,其他类的所属jar包冲突了。

本例子中JobContext类有,只有一个,没有冲突。但是查看异常信息栈,at org.apache.hadoop.hive.shims.ShimLoader.getHadoopShims(ShimLoader.java:95)

ShimLoader类有两个,冲突了。导致爆出上面异常。因此pom.xml中去掉hive-shims-common依赖,如下

java.lang.NoClassDefFoundError: org/apache/hadoop/mapreduce/JobContext

删除hive-shims-common

<dependency>
 <groupId>org.apache.hive</groupId>
 <artifactId>hive-exec</artifactId>
 <version>1.1.0</version>
 <exclusions>
 <exclusion>
   <groupId>org.apache.hive.shims</groupId>
   <artifactId>hive-shims-common</artifactId>
 </exclusion>
 </exclusions>
</dependency>

后呈现真正有问题的地方,TaskAttemptContext类找不到。

java.lang.NoClassDefFoundError: org/apache/hadoop/mapreduce/JobContext

这个属于hadoop-mapreduce-client-core jar包中的类。
<dependency>
 <groupId>org.apache.hadoop</groupId>
 <artifactId>hadoop-mapreduce-client-core</artifactId>
 <version>${hadoop.version}</version>
</dependency>

加上依赖后,类找到了,问题解决。