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 には 2 つの分類子があります。また、Java 7 環境で mrunit を使用すると問題が発生します。

おそらく、hadoop 1.0.x で開発していて、pom.xml ファイルに 2 つの分類子のうちの 1 つだけを追加しました。解決策は簡単です。以下に説明するように、別のものを追加するだけです。それで全部です。

<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 に対してビルドされた場合に発生する傾向があります。この特定のケースでは、0.21 で TaskInputOutputContext が抽象クラスからインターフェイスに変更されたと思います。

したがって、使用している MRUnit バージョンが 0.20 に対してビルドされている間に、0.21 を使用している可能性があります。バージョンを整理するだけです。

于 2012-09-18T20:21:57.130 に答える
0

MRUnit には、Hadoop 1.x と Hadoop 2.x の 2 つのリリース パッケージがあります。mrunit のバージョンが hadoop のバージョンと同じであることを確認する必要があります。

于 2016-06-16T09:17:48.077 に答える