Flink,使用规则'object reuse mode'
Flink, rule of using 'object reuse mode'
文档说这个模式会出bug,但是没有告诉我这个模式的使用规则,什么情况下会出bug?假设我有一份工作,
- 来源:kafka(字节[]数据),
- flat-map: 解析 byte[] 到 Google Protobuf 对象 'foo',创建一个 Tuple2<>(foo.id, foo),然后 return 这个 tuple2
- keyby和process:对于每个id,将第一个foo放入ValueState,如果有多个对象具有相同的id,则更新ValueState。 10 秒后发出第一个 foo(updated)。
这种情况下可以开启'object reuse mode'吗?
对于您所描述的管道,是的,可以安全地启用对象重用。
对象重用仅适用于数据在同一任务中的运算符实例之间转发的情况——因此在您的情况下,在源和平面图之间。 keyBy 强制 ser/de 和网络洗牌,因此不能在 flatmap 和 process 函数之间使用对象重用。但是对象重用也可能适用于流程函数和接收器(我假设存在)之间。
启用对象重用后,不对
安全吗
- 记住跨函数调用的输入对象引用或
- 修改输入对象
如果你避开了这两点,你就可以安全
- 修改一个输出对象并再次发出它
顺便说一下,最好在 DeserializationSchema 或 KafkaDeserializationSchema 中实现反序列化,而不是在平面图中实现,在这种情况下,对象重用与管道的那部分无关。
文档说这个模式会出bug,但是没有告诉我这个模式的使用规则,什么情况下会出bug?假设我有一份工作,
- 来源:kafka(字节[]数据),
- flat-map: 解析 byte[] 到 Google Protobuf 对象 'foo',创建一个 Tuple2<>(foo.id, foo),然后 return 这个 tuple2
- keyby和process:对于每个id,将第一个foo放入ValueState,如果有多个对象具有相同的id,则更新ValueState。 10 秒后发出第一个 foo(updated)。
这种情况下可以开启'object reuse mode'吗?
对于您所描述的管道,是的,可以安全地启用对象重用。
对象重用仅适用于数据在同一任务中的运算符实例之间转发的情况——因此在您的情况下,在源和平面图之间。 keyBy 强制 ser/de 和网络洗牌,因此不能在 flatmap 和 process 函数之间使用对象重用。但是对象重用也可能适用于流程函数和接收器(我假设存在)之间。
启用对象重用后,不对
安全吗- 记住跨函数调用的输入对象引用或
- 修改输入对象
如果你避开了这两点,你就可以安全
- 修改一个输出对象并再次发出它
顺便说一下,最好在 DeserializationSchema 或 KafkaDeserializationSchema 中实现反序列化,而不是在平面图中实现,在这种情况下,对象重用与管道的那部分无关。