Hadoop MRUnit引发异常

Hadoop MRUnit引发异常,hadoop,mapreduce,Hadoop,Mapreduce,我正试图为我的hadoop MR工作编写一些单元测试,并得到以下异常。这是我第一次使用MRUnit,所以我不确定这里发生了什么 java.lang.IncompatibleClassChangeError: Found class org.apache.hadoop.mapreduce.TaskInputOutputContext, but interface was expected at org.apache.hadoop.mrunit.mapreduce.mock.MockCont

我正试图为我的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)
java.lang.CompatibileClassChangeError:找到类org.apache.hadoop.mapreduce.TaskInputOutputContext,但需要接口
位于org.apache.hadoop.mrunit.mapreduce.mock.MockContextWrapper.createCommon(MockContextWrapper.java:53)
位于org.apache.hadoop.mrunit.mapreduce.mock.MockMapContextWrapper.create(MockMapContextWrapper.java:70)
位于org.apache.hadoop.mrunit.mapreduce.mock.MockMapContextWrapper.(MockMapContextWrapper.java:62)
位于org.apache.hadoop.mrunit.mapreduce.MapDriver.run(MapDriver.java:217)
位于org.apache.hadoop.mrunit.MapDriverBase.runTest(MapDriverBase.java:150)
位于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();
}
private-MapDriver-MapDriver=MapDriver.newMapDriver(mapper);
私有ReduceDriver ReduceDriver=ReduceDriver.newReduceDriver(reducer);
私有MapReducedDriver驱动程序=MapReducedDriver.newMapReducedDriver(映射程序,reducer);
@试验
公共void testMapper(){
mapDriver.withInput(新文本(“1”)、新文本(“第1行”);
带有输出(新文本(“1”)、新文本(“第1行”);
runTest();
}

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

因此,很可能您使用的是0.21,而MRUnit版本使用的是0.20。我只想把版本整理好

如中所示,mrunit 0.9中有两个分类器。在Java7环境下使用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>

org.apache.hadoop
hadoop内核
1.0.3
org.apache.mrunit
mrunit
0.9.0-孵化
hadoop1
org.apache.mrunit
mrunit
0.9.0-孵化
hadoop2

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

MRUnit有两个针对Hadoop 1.x和Hadoop 2.x的发行包。您应该确保mrunit版本与hadoop版本相同。

这个奇怪的错误仍然存在,1.0.0使用hadoop2为我修复了它。谢谢