我正在尝试从 CDH3 升级到 CDH4,并且从编译到运行时出现版本冲突。我收到此错误: 线程“主”java.lang.IncompatibleClassChangeError 中的异常:找到接口 org.apache.hadoop.mapreduce.Counter,但应使用类
从谷歌搜索看来,我的代码是针对 Hadoop 1.x 编译的,并且在 Hadoop 2.0 上运行。我在同一个 Hadoop 客户端上编译和运行应用程序,所以它应该都是 Hadoop 2.0。这是我在客户端或此测试集群中的任何其他节点上运行“hadoop 版本”得到的结果: Hadoop 2.0.0-cdh4.4.0 Subversion file:///data/1/jenkins/workspace/generic-package- rhel64-6-0/topdir/BUILD/hadoop-2.0.0-cdh4.4.0/src/hadoop-common-project/hadoop-common -r c0eba6cd38c984557e96a16ccd7356b7de835e79 由 jenkins 于 9 月 3 日星期二 19:33:17 PDT 2013 编译 来源校验和 ac7e170aa709b3ace13dc5f775487180 此命令是使用 /usr/lib/hadoop/hadoop-common-2.0.0-cdh4.4.0.jar 运行的
这是我的 pom.xml 中的相关依赖项和存储库:
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-core</artifactId>
<version>2.0.0-mr1-cdh4.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.0.0-mr1-cdh4.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.mrunit</groupId>
<artifactId>mrunit</artifactId>
<version>0.9.0-incubating</version>
<classifier>hadoop1</classifier>
</dependency>
...
<repository>
<id>cloudera</id>
<name>cloudera</name>
<url>https://repository.cloudera.com/artifactory/cloudera-repos</url>
</repository>
在编译我的应用程序后,这个目录存在于我的 maven 存储库中(我没想到这似乎是我的问题): .m2/repository/org/apache/hadoop/hadoop-core/0.20.2-cdh3u0
但我搜索了应用程序 maven 依赖项:树,对 hadoop-core 的唯一引用是: org.apache.hadoop:hadoop-core:jar:2.0.0-mr1-cdh4.4.0:compile FYI - 我也试过排除MRunit 依赖项和我所有的测试代码,但结果相同。
谁能告诉我如何让我的版本从编译到运行时(为什么我构建应用程序时 hadoop-core/0.20.2-cdh3u0 被拉下)?我相信既然我已经安装了 hadoop MRv1,它在编译和运行时应该是 Hadoop 2.0 代码......但我仍然对 MRv1 中的版本控制感到有些困惑。