Hadoop MRUnit抛出异常

时间:2012-09-16 05:40:05

标签: 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.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();
}

2 个答案:

答案 0 :(得分:1)

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

所以,你可能会使用0.21而你使用的MRUnit版本是0.20。我只是努力让版本整理出来。

答案 1 :(得分:0)

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