将 Flink 工作负载拆分到多个作业时如何避免冗余 IO 和反序列化

How to avoid redundant IO and deserialization when splitting Flink workload across multiple jobs

为了更轻松地部署和管理我们的 Flink 工作负载,我们希望 运行 多个较小的作业,而不是一个包罗万象的大型作业。我们遇到的问题是,这些较小的作业中的每一个都必须从 Kafka 读取和反序列化相同的输入数据。

我们进行的性能测试表明,运行宁多个作业,每个读取输入数据,使用更多的资源,比处理相同的数据作为单个作业花费更长的时间。

有没有一种方法我们可以读取输入数据一次,然后 运行 多个作业只执行处理步骤,或者至少减少与 运行 多个相关的开销职位?

我认为你必须为此付出一些代价,但只要小心一点,你应该能够将成本降到最低。

一些想法:

(1) 使用性能好的序列化器,例如protobuf。参见 the graph toward the end of this blog post

(2) 构建事物,以便您可以利用 reinterpretAsKeyedStream 避免在重新获取以前键入的数据流时出现不必要的 keyBy。

(3) 您可能还会发现 Watermark propagation with Sink API 有趣,因为它与此主题相关。