Apache Beam-我应该了解编写高效数据处理管道的关键概念是什么?

Fir*_*ser 0 google-cloud-dataflow apache-beam

我已经使用Beam一段时间了,我想知道编写高效且优化的Beam管道的关键概念是什么。

我有一些Spark背景知识,并且我知道我们可能更喜欢使用reduceByKey而不是groupByKey以避免混洗并优化网络流量。

Beam也一样吗?

我将不胜感激一些技巧或材料/最佳实践。

Rez*_*kni 5

要考虑的一些事项:

图形设计注意事项:

  • 申报人优先;尽可能在DAG中放置过滤器操作)

  • 早点结合;如果可以选择何时合并,请尽早进行。

  • 如果可能,请在大型滑动窗口之前使用较小的固定窗口,以减少大型滑动窗口的影响。FixedWindow.of(1m)| 结合| SlidingWindow.of(6小时)

  • 大多数跑步者将支持图形融合,这在99%的时间内是正确的选择。但是在大规模扇出变换的情况下,您应该中断融合。

编码员

  • 选择提供良好性能的编码器,例如在Java中使用Proto或Avro编码器之类的东西,而不使用默认的Java序列化。
  • 高级技巧:编码/解码是很大的开销来源。因此,如果您有一个较大的Blob,但只需要结构化的一部分,则可以选择性地仅解码该部分。

记录中

  • 避免在每个元素级别使用Log.info,这很少有价值,并且是许多与性能相关的问题的根本原因。

数据偏斜

  • 了解数据集和热键的含义。用作Nullable的键的字段通常是罪魁祸首...如果需要,请使用并行提示与FanOut
  • 对于一般的钥匙

    • 密钥太少:不好-难以分担工作负载,按密钥排序会影响性能
    • 密钥太多:可能也很糟糕-开销开始增加。
  • 高级按键提示:

    • 有时,您可以将键与元素{key,Window}的窗口结合使用,以帮助更多地分配工作
    • 不是必需的,但是如果您有能力并且想进入这种优化级别;瞄准〜O(10K)至O(100K)键。如果键空间更大,则可以考虑使用散列在内部将键分开。如果键带有日期/时间信息,这将特别有用。在这种情况下,您可以免费地“重用”过去不再使用的过去处理密钥。

源,接收器和外部系统

  • 使用选项标志可以轻松读取压缩文件,但是如果没有Offset TextIO,则无法分发此任务。如果您有很大的文件要读取,请在启动管道之前读取解压缩文件,这可以大大提高性能。还要看看使用压缩的Avro等格式。

    • BackPressure:光束流道设计为能够快速咀嚼平行工作。他们可以在许多计算机上增加许多线程来实现此目标。这很容易淹没外部系统,尤其是在进行每个元素的RPC调用时。如果无法扩展外部系统,请使用startBundle / finishBundle创建批处理以帮助提高每秒的调用次数

    • 光速仍然是光速。:-)避免使用离您的工人远的水槽和水源。

指标

  • 利用Beam指标来检测您的管道。