调用getSplit hadoop 2.0.0-cdh4.0.0时出现IncompatibleClassChangeError

时间:2014-01-03 22:27:14

标签: hadoop mapreduce hdfs cloudera

我正在使用Cloudera-VM。 Hadoop版本:Hadoop 2.0.0-cdh4.0.0。

我编写了一个inputFileFormat,当客户端调用getSplits方法时,我得到一个异常:

IncompatibleClassChangeError found interface org.apache.hadoop.mapreduce.JobContext expecting

我正在使用mapreduce包中没有mapred的类。

然而,当我查看堆栈跟踪时,我发现在某些地方,库已更改为mapred:

Exception in thread "main" java.lang.IncompatibleClassChangeError: Found interface org.apache.hadoop.mapreduce.JobContext, but class was expected
    at com.hadoopApp.DataGeneratorFileInput.getSplits(DataGeneratorFileInput.java:27)
    at org.apache.hadoop.mapred.JobClient.writeNewSplits(JobClient.java:1063)
    at org.apache.hadoop.mapred.JobClient.writeSplits(JobClient.java:1080)
    at org.apache.hadoop.mapred.JobClient.access$600(JobClient.java:174)
    at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:992)
    at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:945)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:396)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1408)
    at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:945)
    at org.apache.hadoop.mapreduce.Job.submit(Job.java:566)
    at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:596)
    at com.hadoopApp.HBaseApp.generateData(HBaseApp.java:54)
    at com.hadoopApp.HBaseApp.run(HBaseApp.java:24)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:84)
    at com.hadoopApp.HBaseApp.main(HBaseApp.java:19)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:208)

不确定这是否有帮助,但我在我的maven pom中使用它:

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-core</artifactId>
    <version>1.2.1</version>
</dependency>

解决了它不确定原因 改变了我的pom并开始工作 - 不知道为什么它解决了它 - 你的意见是赞赏它:

<repositories>
        <repository>
            <id>cloudera</id>
            <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
        </repository>
    </repositories>

         <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>2.0.0-cdh4.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>2.0.0-cdh4.2.0</version>
        </dependency>

如何绕过这个?

1 个答案:

答案 0 :(得分:1)

在cdh4.2.0上使用Hipi时,我遇到了同样的问题。

问题是由Hadoop版本之间的不兼容性引起的(使用Hadoop 1构建的作业可能无法在Hadoop 2上运行)。最初,您使用Hadoop v1构建作业并在Hadoop 2.0.0环境中运行它(cloudera使用Hadoop 2.0.0)。

幸运的是,Hadoop 2.x完全支持hadoop 1.x API,因此使用较新版本的hadoop重建作业会有所帮助。