Apache flink Flink对象重用:修改输入对象?

Apache flink Flink对象重用:修改输入对象?,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我有一个Flink流媒体应用程序,它在Kyro.copy上花费了大约20%的CPU时间。我可以通过启用对象重用模式来避免这种情况,但我有一个小问题:我想将输入对象修改为运算符 对象重用模式的一般约定似乎规定:从映射函数返回后,不要修改输入对象或记住输入对象。您可以在输出后修改对象并重新发射它们。(例如:) 现在,我的问题是:如果我在输出后立即处理对对象的所有引用,并从操作符中删除它们,那么修改输入对象是否安全?或者是否有其他一些规则组合可以使修改输入对象变得安全?是的,这样做是安全的。但请注意,

我有一个Flink流媒体应用程序,它在Kyro.copy上花费了大约20%的CPU时间。我可以通过启用对象重用模式来避免这种情况,但我有一个小问题:我想将输入对象修改为运算符

对象重用模式的一般约定似乎规定:从映射函数返回后,不要修改输入对象或记住输入对象。您可以在
输出后修改对象并重新发射它们。(例如:)


现在,我的问题是:如果我在
输出后立即处理对对象的所有引用,并从操作符中删除它们,那么修改输入对象是否安全?或者是否有其他一些规则组合可以使修改输入对象变得安全?

是的,这样做是安全的。但请注意,立即处置还意味着不能将它们用作映射中的键,这也意味着堆状态后端(可以将其用于查找,但需要在修改时创建副本)。所以对于简单的映射链,它应该可以很好地工作,但是在使用连接、窗口和分组之前,我会仔细检查它,或者在适当的位置创建我自己的防御副本


顺便说一句,如果您想提高性能,几乎总是建议放弃Kryo序列化。如果你有网络流量,Kryo会减慢网络流量。如果是这样,请尝试使用POJO,一些支持良好的格式,如Avro,或者编写自己的序列化程序。这肯定比对象重用更能提高性能。如果您没有任何网络频道,则本段不适用。

遗憾的是,这些消息是(“动态”?)JSON,我认为我几乎无法将它们转换为一个
映射。所以除了高雄别无选择?除此之外,我很好奇:即使我没有任何网络频道,我仍然会与多个运营商一起使用
Kryo.copy
。因此(不包括GC),成本将大约减半,但不是0?如果值类型是固定的(始终为字符串),则可以使用Flinks映射序列化程序甚至Avro的映射。如果没有,你就会被困在原地。我始终建议不要使用动态JSON(例如无模式),并投入时间创建模式,以节省存储、CPU,并使开发变得更好,但如果您无法控制源代码,您就注定要失败。
Kryo.copy
通常在禁用对象重用的情况下在链式操作符之间使用。但是,在广播和连接中,如果启用了对象重用,则需要复制元素(几乎在任何地方,一条重用的记录都不会立即被使用)。