Flink,使用规则'object reuse mode'

Flink, rule of using 'object reuse mode'

文档说这个模式会出bug,但是没有告诉我这个模式的使用规则,什么情况下会出bug?假设我有一份工作,

  1. 来源:kafka(字节[]数据),
  2. flat-map: 解析 byte[] 到 Google Protobuf 对象 'foo',创建一个 Tuple2<>(foo.id, foo),然后 return 这个 tuple2
  3. keyby和process:对于每个id,将第一个foo放入ValueState,如果有多个对象具有相同的id,则更新ValueState。 10 秒后发出第一个 foo(updated)。

这种情况下可以开启'object reuse mode'吗?

对于您所描述的管道,是的,可以安全地启用对象重用。

对象重用仅适用于数据在同一任务中的运算符实例之间转发的情况——因此在您的情况下,在源和平面图之间。 keyBy 强制 ser/de 和网络洗牌,因此不能在 flatmap 和 process 函数之间使用对象重用。但是对象重用也可能适用于流程函数和接收器(我假设存在)之间。

启用对象重用后,

安全吗
  • 记住跨函数调用的输入对象引用或
  • 修改输入对象

如果你避开了这两点,你就可以安全

  • 修改一个输出对象并再次发出它

顺便说一下,最好在 DeserializationSchema 或 KafkaDeserializationSchema 中实现反序列化,而不是在平面图中实现,在这种情况下,对象重用与管道的那部分无关。