我有一个Flink流应用程序,它在Kyro.copy中花费了大约20%的CPU时间。我可以通过打开对象重用模式来避免这种情况,但是我有一个小问题:我想为我的操作员修改输入对象。
对象重用模式的一般约定似乎表明:从地图函数返回后,请勿修改输入对象或记住输入对象。您可以在output
之后修改对象,然后重新发射它们。 (例如:Slide 6)
[现在,我的问题是:如果我从操作员处将它们output
赋给对象后立即丢弃所有对对象的引用,修改输入对象是否安全?还是有一些其他规则组合可以使修改输入对象安全吗?
是的,这很安全。但是请注意,立即处置还意味着您不能将它们用作映射中的键,也意味着堆状态后端(您可以将其用于查找,但需要在修改时创建一个副本)。因此,对于简单的地图链来说,它应该可以很好地工作,但是在使用联接,窗口和分组之前,我会仔细检查它或在适当的位置创建自己的防御性副本。
Btw,如果您想提高性能,几乎总是建议您放弃Kryo序列化。如果您有Kryo,它将降低任何网络流量。如果是这样,请尝试使用POJO,一些受支持的格式(例如Avro)或编写自己的序列化程序。与对象重用相比,这肯定会提高性能。如果您没有任何网络渠道,则此段不适用。