Flink, класс Java рассматривается как класс POJO или общий класс

#apache-flink

Вопрос:

У меня есть класс Java, который используется для хранения состояния:

 public class Speed {  public Speed() {}   public Speed(double speed, Telemetry telemetry) {  this.speed = speed;  this.telemetry = telemetry;  }   public double speed;  public Telemetry telemetry; }  

Телеметрия-это не класс POJO, и я предоставил для нее serde.

 public class TelemetryKryoSerializerlt;T extends Telemetrygt; extends Serializerlt;Tgt; {   @Override  public void write(Kryo kryo, Output output, T object) {  byte[] bytes;   TelemetryProto.Builder builder = object.toProtoBuilder();  bytes = builder.build().toByteArray();  output.writeInt(bytes.length);  output.write(bytes);  }   @Override  public T read(Kryo kryo, Input input, Classlt;Tgt; type) {  int l = input.readInt();  byte[] bytes = input.readBytes(l);  Telemetry telemetry = null;   telemetry = Telemetry.parseFrom(bytes);  return (T) telemetry;  } }  

Как я могу подтвердить, рассматривается ли указанный выше класс как класс POJO или общий класс?

Обновить:

Я зарегистрировал класс телеметрии и его сериализатор следующим образом:

 env.getConfig().registerTypeWithKryoSerializer(DataElement.class, DataElementKryoSerializer.class);  

Ниже приведены результаты упомянутых методов getRegistered* :

 Registered Kryo types: lt;NONEgt;  Registered Pojo types: class a.b.c.Telemetry does not contain a getter for field telemetryProtoBuilder class a.b.c.Telemetry does not contain a setter for field telemetryProtoBuilder Class class a.b.c.Telemetry cannot be used as a POJO type because not all fields are valid POJO fields, and must be processed as GenericType. Please read the Flink documentation on "Data Types amp; Serialization" for details of the effect on performance.  TypeSerializer for Telemetry org.apache.flink.api.java.typeutils.runtime.kryo.KryoSerializer class a.b.c.Telemetry does not contain a getter for field telemetryProtoBuilder class a.b.c.Telemetry does not contain a setter for field telemetryProtoBuilder Class class a.b.c.Telemetry cannot be used as a POJO type because not all fields are valid POJO fields, and must be processed as GenericType. Please read the Flink documentation on "Data Types amp; Serialization" for details of the effect on performance.  

Ответ №1:

Все это полезно для отладки проблем сериализации:

  • ExecutionConfig#getDefaultKryoSerializerClasses()
  • ExecutionConfig#getRegisteredKryoTypes()
  • ExecutionConfig#getRegisteredPojoTypes()
  • TypeInformation#of(MyClass.class).createSerializer()

Последний из них покажет вам, для какого сериализатора используется Флинк MyClass .

Комментарии:

1. Я обновил свой вопрос с выводом методов, о которых вы упомянули, очень полезно. TypeSerializer Для телеметрии указан KryoSerializer сериализатор и сериализатор, который я зарегистрировал. Не могли бы вы, пожалуйста, помочь мне понять, почему?

2. Что это значит, когда класс не может использоваться как тип POJO и обрабатываться как тип GenericType. Каковы последствия этого? И имеет ли это значение в данном случае, учитывая, что предусмотрен де/сериализатор?