Flink 对象重用:修改输入对象?
Flink object reuse: modify input objects?
我有一个 Flink 流应用程序,它在 Kyro.copy 上花费了大约 20% 的 CPU 时间。我可以通过打开对象重用模式来避免这种情况,但我有一个小问题:我想修改我的操作员的输入对象。
对象重用模式的一般契约似乎声明:从 map 函数返回后不要修改输入对象或记住输入对象。您可以在 output
之后修改对象并重新发出它们。 (例如:Slide 6)
现在,我的问题是:如果我在操作员对对象进行 output
处理后立即处理所有对对象的引用,那么修改输入对象是否安全?或者是否有一些其他的规则组合可以安全地修改输入对象?
是的,这样会很安全。但请注意,立即处置也意味着您不能将它们用作映射中的键,这也意味着堆状态后端(您可以将其用于查找,但需要在修改时创建一个副本)。所以对于简单的映射链,它应该工作得很好,但在使用连接、windows 和分组之前,我会仔细检查它或在适当的地方创建我自己的防御副本。
顺便说一句,如果您想提高性能,几乎总是建议放弃 Kryo 序列化。如果有的话,Kryo 会减慢任何网络流量。如果是这样,请尝试使用 POJO、一些支持良好的格式(如 Avro),或者编写您自己的序列化程序。这肯定会比对象重用更能提高性能。如果您没有任何网络渠道,则此段不适用。
我有一个 Flink 流应用程序,它在 Kyro.copy 上花费了大约 20% 的 CPU 时间。我可以通过打开对象重用模式来避免这种情况,但我有一个小问题:我想修改我的操作员的输入对象。
对象重用模式的一般契约似乎声明:从 map 函数返回后不要修改输入对象或记住输入对象。您可以在 output
之后修改对象并重新发出它们。 (例如:Slide 6)
现在,我的问题是:如果我在操作员对对象进行 output
处理后立即处理所有对对象的引用,那么修改输入对象是否安全?或者是否有一些其他的规则组合可以安全地修改输入对象?
是的,这样会很安全。但请注意,立即处置也意味着您不能将它们用作映射中的键,这也意味着堆状态后端(您可以将其用于查找,但需要在修改时创建一个副本)。所以对于简单的映射链,它应该工作得很好,但在使用连接、windows 和分组之前,我会仔细检查它或在适当的地方创建我自己的防御副本。
顺便说一句,如果您想提高性能,几乎总是建议放弃 Kryo 序列化。如果有的话,Kryo 会减慢任何网络流量。如果是这样,请尝试使用 POJO、一些支持良好的格式(如 Avro),或者编写您自己的序列化程序。这肯定会比对象重用更能提高性能。如果您没有任何网络渠道,则此段不适用。