Java 如何在Flink中使用LocalDate字段高效地序列化POJO?

Java 如何在Flink中使用LocalDate字段高效地序列化POJO?,java,apache-flink,Java,Apache Flink,我们的一些POJO包含java.time API中的字段(LocalDate,LocalDateTime)。当我们的管道处理它们时,我们可以在日志中看到以下信息: org.apache.flink.api.java.typeutils.TypeExtractor - Class class java.time.LocalDate cannot be used as a POJO type because not all fields are valid POJO fields, and must

我们的一些POJO包含java.time API中的字段(LocalDate,LocalDateTime)。当我们的管道处理它们时,我们可以在日志中看到以下信息:

org.apache.flink.api.java.typeutils.TypeExtractor - Class class java.time.LocalDate 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 & Serialization" for details of the effect on performance.
据我所知,LocalDate不能归类为POJO,因此flink没有使用POJO序列化程序,而是使用效率较低的Kryo。但是,由于1.9.0版本flink为java.time类提供了专用的序列化程序(例如
LocalDateSerializer
),因此我希望这些序列化程序能够在这里完成工作,允许我们的类使用POJO序列化程序。不是这样吗?如果是,是否有任何性能损失?如果没有,这种情况下的最佳解决方案是什么


在该项目中,我们将Flink 1.11与Java 1.8一起使用。

由于向后兼容,即使在Flink中引入了新的序列化程序,也无法自动使用它。但是,您可以告诉Flink在您的POJO中这样使用它(如果您开始使用Kryo之前没有保存点):

@TypeInfo(MyClassTypeInfoFactory.class)
公共类MyClass{
公共int id;
公共本地日期;
// ...
}
公共类MyClassTypeInfoFactory扩展了TypeInfoFactory{
@凌驾
公共类型信息createTypeInfo(
类型t,映射>(){{
put(“id”,Types.INT);
put(“日期”,类型。本地日期);
// ...
} } );
}
}
您必须为所有POJO字段提供类型,如图所示,但是在
types
类中有许多帮助程序可以使用。此外,通过像这样使用
TypeInfoFactory
,您不必担心Flink使用此类型的所有地方——它将始终派生给定的类型信息


如果您需要转换旧的保存点以使用新的序列化程序,您可能还需要查看。

谢谢您的回答,它非常有用。
@TypeInfo(MyClassTypeInfoFactory.class)
public class MyClass {
  public int id;
  public LocalDate date;
  // ...
}

public class MyClassTypeInfoFactory extends TypeInfoFactory<MyClass> {
  @Override
  public TypeInformation<MyClass> createTypeInfo(
      Type t, Map<String, TypeInformation<?>> genericParameters) {

    return Types.POJO(MyClass.class, new HashMap<String, TypeInformation<?>>() { {
        put("id", Types.INT);
        put("date", Types.LOCAL_DATE);
        // ...
    } } );
  }
}