2012-04-12 11 views
1

Mapper &入力、マップ出力、出力にAVROを使用するリデューサを作成しました。 MRUnitテストを作成する際に、私は、次のスタックトレースを取得:MRUnitとAVROを一緒に使用する

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) 

次のようにドライバが(iはアブロの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のとアブロMapRed 1.6.3からのHadoop & MRUnit 0.20.2-cdh3u2を使用しています。

+0

匹敵する必要がないようにK2型パラメータの制限を緩和しますか? –

+0

ドライバの前にコンフィギュレーションが作成されました。バージョン番号も追加されました。 – Salandur

+0

MapReduceDriverコンストラクタラインのコンパイルエラーが発生しました: 'バインドされた不一致:タイプAvroKey はMapReduceDriver K2、V2、K3、V3> 'である。私は(MRUnitなしで)シリアライゼーション工場のシンプルな単体テストを得ることができます(MRUnitなし) –

答えて

1

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

MRUITには、MRUNIT-45、MRUNIT-70、MRUNIT-77、MRUNIT-86、https://issues.apache.org/jira/browse/MRUNITなどのWritable以外のいくつかのバグがありました。これらのバグには、SerializationFactoryコンストラクタに正しく渡されないconfが含まれているか、すべてのWritableが持つKeyまたはValueからコードにデフォルトのコンストラクタが必要でした。これらの修正はすべてApache MRUnit 0.9.0で行われます。これは今週中にリリースされる予定です。

クルーダの0.20.2-cdh3u2 MRUnitはApache MRUnit 0.5.0-インキュベーションに近いです。あなたのコードは0.9.0のインキュベーションでも問題になるかもしれないと思います。完全なコード例を[email protected]に電子メールで送ってください。Apache MRUnitプロジェクトはそれを見てうれしいです

これは今MRUNIT-99をコンパイルしますが、使用している、とあなたは、ドライバを作成する前に、設定 `io.serializations`を設定しているmrunitのバージョンは何

+0

私は0.9.0のインキュベーションに切り替えました。もう一つの例外があります:java.lang.ClassCastException:java.lang.Longをjava.lang.CharSequenceにキャストできません。そのことを今見てください – Salandur

+0

も参照してくださいhttp://stackoverflow.com/a/15235952/1408527 – oby1

関連する問題