将 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 有趣,因为它与此主题相关。
为了更轻松地部署和管理我们的 Flink 工作负载,我们希望 运行 多个较小的作业,而不是一个包罗万象的大型作业。我们遇到的问题是,这些较小的作业中的每一个都必须从 Kafka 读取和反序列化相同的输入数据。
我们进行的性能测试表明,运行宁多个作业,每个读取输入数据,使用更多的资源,比处理相同的数据作为单个作业花费更长的时间。
有没有一种方法我们可以读取输入数据一次,然后 运行 多个作业只执行处理步骤,或者至少减少与 运行 多个相关的开销职位?
我认为你必须为此付出一些代价,但只要小心一点,你应该能够将成本降到最低。
一些想法:
(1) 使用性能好的序列化器,例如protobuf。参见 the graph toward the end of this blog post。
(2) 构建事物,以便您可以利用 reinterpretAsKeyedStream 避免在重新获取以前键入的数据流时出现不必要的 keyBy。
(3) 您可能还会发现 Watermark propagation with Sink API 有趣,因为它与此主题相关。