您如何确定要在 Google Dataflow 流式传输管道中配置多少资源?

How do you determine how many resources to provision in a Google Dataflow streaming pipeline?

我很好奇如何决定如何在 Google 的数据流平台上为 Apache Beam 管道 运行 提供资源。我构建了一个流式传输管道 (Beam Java 2.0.0),它采用 PubSub JSON 字符串,将其转换为 BQ TableRow,然后将其路由到正确的表。管道中还有两个转换,一个每分钟滑动 window 5 分钟,另一个 window 固定持续时间为 1 分钟。

对于某些上下文,每条传入消息大约是一个 1KB JSON 字符串,并且在极端峰值时,管道将在一秒内接收 250,000 条消息。我的滑动时间 window 可能会在关闭前增长到 5,000,000 百万表行/分钟(最坏的情况,但这就是我们的计划)。我们典型的峰值流量使用量约为 75k 消息/秒。然而,90% 的时间我们的管道每秒只处理 30 条消息。

我们 运行 在启用了自动缩放的数据流上,默认情况下 Google 规定 4 CPUs、15GB 和 420gb * max_number worker 用于流式传输管道。设置 10 个最大工作器后,我们将为每月 4.2TB 的磁盘使用量付费。这似乎有点矫枉过正,但我​​不知道我应该查看哪些数据来验证我的理论。

我一直在考虑的是使用 2 CPUs 和 7.5 GB 内存,每个 worker 20GB SSD,并将最大 worker 数量设置为 50。在这种配置下,我们至少有 4 个工人。

我的演讲总结:
- 您如何确定流媒体管道所需的 CPU、RAM 和磁盘 space?
- 您如何确定管道应该提供 SSD 资源而不是标准硬盘驱动器?
- 我可以查看哪些指标来衡量管道的性能?

由于管道非常不同,因此没有通用的通用方法来说明要使用多少工作人员和多大的磁盘。不过,有几种方法效果很好:

  1. Dataflow 的水平缩放非常接近线性。这表示 如果你 运行 采样管道(例如,通过采样 10% 的输入 流量)您可以非常快速地估计资源的全部 管道将需要,而不会多付钱。您可以判断输入是否为 "keeping up",系统延迟是否保持在较低水平,并且数据水印是否继续推进。然后你可以估计 使用此策略,您的管道在峰值输入速率下需要的 最大 工人数。让我们拨打这个号码 m
  2. 完成上述操作后,您可以依靠 autoscaling,将 maxNumWorkers 标志设置为数字 k*m,其中 k 将有效地确定您的速度有多快管道可以在峰值负载时从积压中赶上。例如,在 k=1 时,管道只能跟上峰值负载,因此峰值负载下的积压可能永远不会耗尽,或者等待非峰值负载耗尽。在 k=2 时,管道可以处理 2 倍的峰值负载,因此它会更快地赶上。当然,这是在积压期间您愿意为多少资源付费以及您愿意容忍多少追赶延迟的权衡。
  3. 自动缩放还将确保管道在非高峰负载期间缩减规模,这样您就不会在非高峰时段为所有资源付费。

其他一些注意事项:

  • 4 个 CPU worker 与 2 个 CPU worker 相比,流式数据流往往表现更好。这是因为有一些每个工作人员的开销,以及优化为 4 CPU 个工作人员的工作并行性的某些调整。
  • 使用数据流时应该默认启用 SSD,因为 SSD 可以显着提高写入吞吐量并带来更好的性能。