Java 如何在Flink中使用LocalDate字段高效地序列化POJO?
我们的一些POJO包含java.time API中的字段(LocalDate,LocalDateTime)。当我们的管道处理它们时,我们可以在日志中看到以下信息: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
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);
// ...
} } );
}
}