我正在尝试为我的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)
Run Code Online (Sandbox Code Playgroud)
我的实际代码看起来很简单
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();
}
Run Code Online (Sandbox Code Playgroud)
Don*_*Lee 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>
Run Code Online (Sandbox Code Playgroud)
我认为这个bug会在下一个版本中得到解决,但我无法确信.
如果您使用的 MRUnit 版本是针对与您正在测试的代码不同的 Hadoop 版本构建的,则很可能会发生此错误。在这种特殊情况下,我相信 TaskInputOutputContext 在 0.21 中已从抽象类更改为接口。
因此,您可能使用的是 0.21,而您使用的 MRUnit 版本是针对 0.20 构建的。我只会努力整理版本。
| 归档时间: |
|
| 查看次数: |
3806 次 |
| 最近记录: |