1

入力、マップ出力、およびリデュース出力にAVROを使用するMapper&Reducerを作成しました。MRUnitテストを作成すると、次のスタックトレースが取得されます。

java.lang.NullPointerException
at org.apache.hadoop.io.serializer.SerializationFactory.getSerializer(SerializationFactory.java:73)
at org.apache.hadoop.mrunit.mock.MockOutputCollector.deepCopy(MockOutputCollector.java:74)
at org.apache.hadoop.mrunit.mock.MockOutputCollector.collect(MockOutputCollector.java:110)
at org.apache.hadoop.mrunit.mapreduce.mock.MockMapContextWrapper$MockMapContext.write(MockMapContextWrapper.java:119)
at org.apache.avro.mapreduce.AvroMapper.writePair(AvroMapper.java:22)
at com.bol.searchrank.phase.day.DayMapper.doMap(DayMapper.java:29)
at com.bol.searchrank.phase.day.DayMapper.doMap(DayMapper.java:1)
at org.apache.avro.mapreduce.AvroMapper.map(AvroMapper.java:16)
at org.apache.avro.mapreduce.AvroMapper.map(AvroMapper.java:1)
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144)
at org.apache.hadoop.mrunit.mapreduce.MapDriver.run(MapDriver.java:200)
at org.apache.hadoop.mrunit.mapreduce.MapReduceDriver.run(MapReduceDriver.java:207)
at com.bol.searchrank.phase.day.DayMapReduceTest.shouldProduceAndCountTerms(DayMapReduceTest.java:39)

ドライバーは次のように初期化されます(私はAvro MapReduce API実装を作成しました):

    driver = new MapReduceDriver<AvroWrapper<Pair<Utf8, LiveTrackingLine>>, NullWritable, AvroKey<Utf8>, AvroValue<Product>, AvroWrapper<Pair<Utf8, Product>>, NullWritable>().withMapper(new DayMapper()).withReducer(new DayReducer());

io.serializationを使用して構成オブジェクトを追加しても、役に立ちません。

    Configuration configuration = new Configuration();
    configuration.setStrings("io.serializations", new String[] {
        AvroSerialization.class.getName()
    });
    driver = new MapReduceDriver<AvroWrapper<Pair<Utf8, LiveTrackingLine>>, NullWritable, AvroKey<Utf8>, AvroValue<Product>, AvroWrapper<Pair<Utf8, Product>>, NullWritable>().withMapper(new DayMapper()).withReducer(new DayReducer()).withConfiguration(configuration);

ClouderaのHadoop&MRUnit0.20.2-cdh3u2とAvroMapRed1.6.3を使用しています。

4

1 に答える 1

1

SerializationFactoryがio.serializationsでSerializationを実装する受け入れ可能なクラスを見つけられないため、NPEを取得しています。

MRUnitには、 https: //issues.apache.org/jira/browse/MRUNITにあるMRUNIT-45、MRUNIT-70、MRUNIT-77、MRUNIT-86など、書き込み可能以外のシリアル化に関連するいくつかのバグがありました。これらのバグには、confがSerializationFactoryコンストラクターに正しく渡されないか、コードにすべての書き込み可能ファイルが持つキーまたは値からのデフォルトコンストラクターが必要であることが含まれていました。これらの修正はすべて、Apache MRUnit 0.9.0-incubatingに表示され、今週中にリリースされる予定です。

Clouderaの0.20.2-cdh3u2MRUnitは、ApacheMRUnit0.5.0に近いインキュベーションです。0.9.0でのインキュベーションでも、コードはまだ問題になる可能性があると思います。完全なコード例をmrunit-user@incubator.apache.orgに電子メールで送信してください。そうすれば、ApacheMRUnitプロジェクトが喜んでそれを見ていきます。

これでコンパイルされますMRUNIT-99は、K2タイプパラメータの制限を緩和して、比較可能である必要がないようにします

于 2012-04-15T22:16:39.827 に答える