7

我正在尝试为我的 hadoop MR 工作编写一些单元测试并得到以下异常。这是我第一次使用 MRUnit,所以我不太确定这里发生了什么。

java.lang.IncompatibleClassChangeError: Found class org.apache.hadoop.mapreduce.TaskInputOutputContext, but interface was expected
    at org.apache.hadoop.mrunit.mapreduce.mock.MockContextWrapper.createCommon(MockContextWrapper.java:53)
    at org.apache.hadoop.mrunit.mapreduce.mock.MockMapContextWrapper.create(MockMapContextWrapper.java:70)
    at org.apache.hadoop.mrunit.mapreduce.mock.MockMapContextWrapper.<init>(MockMapContextWrapper.java:62)
    at org.apache.hadoop.mrunit.mapreduce.MapDriver.run(MapDriver.java:217)
    at org.apache.hadoop.mrunit.MapDriverBase.runTest(MapDriverBase.java:150)
    at org.apache.hadoop.mrunit.TestDriver.runTest(TestDriver.java:137)

我的实际代码看起来很简单

private MapDriver<Text, Text, Text, Text> mapDriver = MapDriver.newMapDriver(mapper);
private ReduceDriver<Text, Text, Text, Text> reduceDriver = ReduceDriver.newReduceDriver(reducer);
private MapReduceDriver<Text, Text, Text, Text, Text, Text> driver = MapReduceDriver.newMapReduceDriver(mapper, reducer);

@Test
public void testMapper() {
    mapDriver.withInput(new Text("1"), new Text("Line 1"));
    mapDriver.withOutput(new Text("1"), new Text("Line 1"));
    mapDriver.runTest();
}
4

3 回答 3

11

正如您在这里看到的,mrunit 0.9 中有两个分类器。在 Java 7 环境下使用 mrunit 也存在一些问题。

也许,您正在使用 hadoop 1.0.x 进行开发,并且在 pom.xml 文件中仅添加了两个分类器之一。解决方案很简单:只需添加另一个,如下所述。就这样。

<dependencies>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-core</artifactId>
        <version>1.0.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.mrunit</groupId>
        <artifactId>mrunit</artifactId>
        <version>0.9.0-incubating</version>
        <classifier>hadoop1</classifier>
    </dependency>
    <dependency>
        <groupId>org.apache.mrunit</groupId>
        <artifactId>mrunit</artifactId>
        <version>0.9.0-incubating</version>
        <classifier>hadoop2</classifier>
    </dependency>
</dependencies>

我认为这个错误会在下一个版本中解决,但我不能相信。

于 2012-09-18T21:59:07.460 回答
1

如果您使用的 MRUnit 版本是针对与您正在测试的代码不同的 Hadoop 版本构建的,则往往会发生此错误。在这种特殊情况下,我相信 TaskInputOutputContext 在 0.21 中已从抽象类更改为接口。

因此,您可能使用的是 0.21,而您使用的 MRUnit 版本是针对 0.20 构建的。我只会努力整理好版本。

于 2012-09-18T20:21:57.130 回答
0

MRUnit 有两个用于 Hadoop 1.x 和 Hadoop 2.x 的发布包。您应该确保 mrunit 版本等于 hadoop 版本。

于 2016-06-16T09:17:48.077 回答