繁体   English   中英

如何向 Flink 注册 TypeSerializer?

[英]How to register a TypeSerializer with Flink?

我将 Flink 与 Scala 一起使用,为了更好地支持 state 迁移,我决定从“让 Flink 通过内省处理所有事情”转向更明确的序列化/反序列化。 这样,当我对我的类进行更改时,我可以决定如何处理我的 ser/deser 中的差异。

因此,我决定使用 Avro 进行 go,主要遵循我在本文中找到的建议: https://medium.com/wbaa/making-sense-of-apache-flink-state-migration-with-scala-and-avro-69091

并从这个示例项目中获得灵感: https://github.com/mrooding/flink-avro-state-serialization

阅读这篇文章,我可以理解在 function 中显式创建 state 时如何使用自定义序列化程序。

例如,我可以在定义 state 时这样写:

  private[this] lazy val stateDescriptor: ValueStateDescriptor[Product] =
    new ValueStateDescriptor[Product]("product-join", Product.serializer)
  private[this] lazy val state: ValueState[Product] = getRuntimeContext.getState(stateDescriptor)

问题是,当 Flink 从我的管道隐式创建 state 时,我不知道如何注册序列化程序。 例如,如果我创建一个FlatMapFunction[T, O] Flink 将创建一个类型为TO的 state 以保存块之间的实例。 在这种情况下,它仍然会进行自省,因为我不知道如何告诉 Flink 使用我的TypeSerializer

我找到了使用StreamExecutionEnvironment注册 Kryo 类型的文档,但不是TypeSerializer 我的目标不是直接使用 Kryo,而是直接使用 Avro。

那么我将如何 go 在我的环境中全局注册一个TypeSerializer ,以便 Flink 知道使用它而不是使用自省?

您需要实现一个 TypeInfoFactory 并使用 @TypeInfo 注释您的类型。 工厂需要返回一个 TypeInformation,它充当 TypeSerializer 的一种工厂。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM