0

私はクラスを持っています:

 class Class1 implements Writable{
       int intField;
       double doubleField;
       Class2 refToClass2;

       public void readField(DataInput in){...}
       public void write(DataOutput out){...}


 class Class2 implements Serializable, Writable{
     ....
 }

Class1を出力値として使用すると、Hadoopはレデューサー側でこのエラーをスローします。

 java.lang.NullPointerException
at org.apache.hadoop.io.serializer.SerializationFactory.getSerializer(SerializationFactory.java:73)
at org.apache.hadoop.io.SequenceFile$Writer.init(SequenceFile.java:961)
at org.apache.hadoop.io.SequenceFile$Writer.<init>(SequenceFile.java:892)
at org.apache.hadoop.io.SequenceFile.createWriter(SequenceFile.java:393)
at org.apache.hadoop.io.SequenceFile.createWriter(SequenceFile.java:354)
at org.apache.hadoop.io.SequenceFile.createWriter(SequenceFile.java:476)
at org.apache.hadoop.mapreduce.lib.output.SequenceFileOutputFormat.getRecordWriter(SequenceFileOutputFormat.java:61)
at org.apache.hadoop.mapred.ReduceTask$NewTrackingRecordWriter.<init>(ReduceTask.java:569)

私の直感によると、問題はClass1に関連している、またはSerializableとWritableの両方を実装するClass2に関連している可能性が高いとのことです。

何か案は ?

アップデート:

問題をローカライズしました。問題はClass1ですが、これはWritableのみを実装するように変更されました(Serializableも実装されていません)。また、Class2への参照が含まれなくなったという意味で変更しました。それでも同じエラーが発生します。Class1を出力値として別の書き込み可能な実装に置き換えると、機能します。なぜ ??

4

1 に答える 1

1

問題は、私がばかげた間違いを犯していたことです。jar を更新していませんでした。したがって、基本的に Class1 は古い (使用中の) jar に Writable インターフェースを実装していませんでした。

一般的な観察として、OPで指定されたエラーには、シリアライズしようとしている特定のタイプのシリアライザをHADOOPが見つけられないという根本的な原因があります(直接的または間接的に、たとえばそのタイプを出力として使用することによって)キー/値)。Hadoop は、次の 2 つの理由のいずれかで Serilizer を見つけることができません。

  1. あなたの型はシリアライズ可能ではありません (つまり、書き込み可能またはシリアライズ可能を実装していません)
  2. タイプが実装するシリアライゼーションのタイプに対して Hadoop で使用できる Serializer はありません (例: タイプは Writable を実装しますが、hadoop は何らかの理由で org.apache.hadoop.io.serializer.WritableSerialization クラスを使用できません)。
于 2012-09-16T18:41:02.210 に答える