[ 
https://issues.apache.org/jira/browse/AVRO-3438?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Martin Tzvetanov Grigorov updated AVRO-3438:
--------------------------------------------
    Component/s: java

> NPE when serializing Avro GenericRecord with Kryo
> -------------------------------------------------
>
>                 Key: AVRO-3438
>                 URL: https://issues.apache.org/jira/browse/AVRO-3438
>             Project: Apache Avro
>          Issue Type: Bug
>          Components: java
>    Affects Versions: 1.11.0, 1.10.2
>            Reporter: Arseniy Tashoyan
>            Priority: Major
>
> We have an Apache Flink application, that processes Avro GenericRecords. 
> Flink uses Kryo serialization. The serialization fails:
>  
> com.esotericsoftware.kryo.KryoException: java.lang.NullPointerException
> Serialization trace:
> props (org.apache.avro.Schema$Field)
> fieldMap (org.apache.avro.Schema$RecordSchema)
> schema (org.apache.avro.generic.GenericData$Record)
> values (org.apache.avro.generic.GenericData$Record)
> values (org.apache.avro.generic.GenericData$Record)
> at 
> com.esotericsoftware.kryo.serializers.ObjectField.write(ObjectField.java:82) 
> ~[kryo-2.24.0.jar:?]
> at 
> com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:495)
>  ~[kryo-2.24.0.jar:?]
> at com.esotericsoftware.kryo.Kryo.writeClassAndObject(Kryo.java:599) 
> ~[kryo-2.24.0.jar:?]
> at 
> com.esotericsoftware.kryo.serializers.MapSerializer.write(MapSerializer.java:95)
>  ~[kryo-2.24.0.jar:?]
> at 
> com.esotericsoftware.kryo.serializers.MapSerializer.write(MapSerializer.java:21)
>  ~[kryo-2.24.0.jar:?]
> at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:523) 
> ~[kryo-2.24.0.jar:?]
> at 
> com.esotericsoftware.kryo.serializers.ObjectField.write(ObjectField.java:61) 
> ~[kryo-2.24.0.jar:?]
> at 
> com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:495)
>  ~[kryo-2.24.0.jar:?]
> at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:523) 
> ~[kryo-2.24.0.jar:?]
> at 
> com.esotericsoftware.kryo.serializers.ObjectField.write(ObjectField.java:61) 
> ~[kryo-2.24.0.jar:?]
> ...
> Caused by: java.lang.NullPointerException
> at org.apache.avro.JsonProperties$2$1$1.<init>(JsonProperties.java:175) 
> ~[avro-1.10.2.jar:1.10.2]
> at org.apache.avro.JsonProperties$2$1.iterator(JsonProperties.java:174) 
> ~[avro-1.10.2.jar:1.10.2]
> at 
> com.esotericsoftware.kryo.serializers.MapSerializer.write(MapSerializer.java:80)
>  ~[kryo-2.24.0.jar:?]
> at 
> com.esotericsoftware.kryo.serializers.MapSerializer.write(MapSerializer.java:21)
>  ~[kryo-2.24.0.jar:?]
> at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:523) 
> ~[kryo-2.24.0.jar:?]
> at 
> com.esotericsoftware.kryo.serializers.ObjectField.write(ObjectField.java:61) 
> ~[kryo-2.24.0.jar:?]
> ...
>  
> This problem occurs, because Kryo uses Unsafe to copy objects. When creating 
> an object, Unsafe does not call the class constructor. Therefore the field 
> *props* in the class JsonProperties is not properly initialized. The field 
> *props* is implemented via anonymous inner classes. The NullPointerException 
> occurs at JsonProperties.java:175, because the reference to the enclosing 
> instance of AbstractSet is null.
> A possible fix is to avoid using anonymous classes, use normal classes 
> instead.  A similar case: 
> [https://stackoverflow.com/questions/36902471/inner-class-reference-to-enclosing-class-instance-is-null]
>  
> Avro: 1.10.2
> Kryo: 2.24.0
> Flink: 1.12.4



--
This message was sent by Atlassian Jira
(v8.20.1#820001)

Reply via email to