Apache Beam - 我应该了解哪些用于编写高效数据处理管道的关键概念?
Apache Beam - What are the key concepts for writing efficient data processing pipelines I should be aware of?
我已经使用 Beam 一段时间了,我想知道编写高效和优化的 Beam 管道的关键概念是什么。
我有一点 Spark 背景,我知道我们可能更喜欢使用 reduceByKey 而不是 groupByKey 来避免改组和优化网络流量。
Beam也是这样吗?
我希望得到一些提示或 materials/best 实践。
需要考虑的一些事项:
图形设计注意事项:
先归档;将过滤器操作尽可能放在 DAG 中)
早点结合;如果可以选择何时合并,请尽早进行。
如果可能,在大滑动 window 之前使用较小的固定 windows 来减少大滑动 windows 的影响。 FixedWindow.of(1m) |合并 | SlidingWindow.of(6小时)
大多数跑步者都会支持图形融合,这在 99% 的情况下都是正确的。但是在大规模扇出变换的情况下,你应该打破融合。
程序员
- 选择提供良好性能的编码器,例如在 Java 中使用 Proto 或 Avro 编码器之类的东西,而不是默认的 java 序列化。
- 高级提示:Encoding/decoding 是一个很大的开销来源。因此,如果你有一个大的 blob 但只需要结构化它的一部分,你可以有选择地只解码那部分。
日志记录
- 在每个元素级别避免 Log.info,这很少有价值,并且是许多与性能相关的问题的根本原因。
数据偏差
- 了解数据集和热键的含义。用作可空键的字段通常是罪魁祸首...如果需要,请使用并行提示 withFanOut
对于一般的键
- 键太少:不好 - 难以分片工作负载和按键排序会影响性能
- 键太多:也可能很糟糕 - 开销开始逐渐增加。
高级按键提示:
- 有时您可以将键与元素 {key,Window} 的 window 结合起来,以帮助分配工作更多
- 不是必需的,但如果您有能力并且想进入这个优化级别;瞄准 ~ O(10K) 到 O(100K) 键。如果键空间大得多,您可以考虑使用散列在内部分离键。如果键带有 date/time 信息,这将特别有用。在这种情况下,您可以 "re-use" 基本上免费处理过去不再活跃的密钥。
源、接收器和外部系统
使用选项标志可以轻松读取压缩文件,但是没有偏移量,TextIO 无法分发此任务。如果您有非常大的文件要读取,在启动管道之前解压缩文件可以提供很好的性能提升。另请查看使用压缩 Avro 等格式。
BackPressure:Beam runners 被设计成能够通过并行工作快速咀嚼。他们可以在多台机器上启动多线程来实现这个目标。这很容易淹没外部系统,尤其是在您进行每个元素的 RPC 调用时。如果无法扩展外部系统,请使用 startBundle / finishBundle 创建批处理以帮助提高每秒调用次数
光速,还是光速.. :-) 避免使用离你的工人很远的水槽和光源。
指标
- 利用 Beam 指标来检测您的管道。
我已经使用 Beam 一段时间了,我想知道编写高效和优化的 Beam 管道的关键概念是什么。
我有一点 Spark 背景,我知道我们可能更喜欢使用 reduceByKey 而不是 groupByKey 来避免改组和优化网络流量。
Beam也是这样吗?
我希望得到一些提示或 materials/best 实践。
需要考虑的一些事项:
图形设计注意事项:
先归档;将过滤器操作尽可能放在 DAG 中)
早点结合;如果可以选择何时合并,请尽早进行。
如果可能,在大滑动 window 之前使用较小的固定 windows 来减少大滑动 windows 的影响。 FixedWindow.of(1m) |合并 | SlidingWindow.of(6小时)
大多数跑步者都会支持图形融合,这在 99% 的情况下都是正确的。但是在大规模扇出变换的情况下,你应该打破融合。
程序员
- 选择提供良好性能的编码器,例如在 Java 中使用 Proto 或 Avro 编码器之类的东西,而不是默认的 java 序列化。
- 高级提示:Encoding/decoding 是一个很大的开销来源。因此,如果你有一个大的 blob 但只需要结构化它的一部分,你可以有选择地只解码那部分。
日志记录
- 在每个元素级别避免 Log.info,这很少有价值,并且是许多与性能相关的问题的根本原因。
数据偏差
- 了解数据集和热键的含义。用作可空键的字段通常是罪魁祸首...如果需要,请使用并行提示 withFanOut
对于一般的键
- 键太少:不好 - 难以分片工作负载和按键排序会影响性能
- 键太多:也可能很糟糕 - 开销开始逐渐增加。
高级按键提示:
- 有时您可以将键与元素 {key,Window} 的 window 结合起来,以帮助分配工作更多
- 不是必需的,但如果您有能力并且想进入这个优化级别;瞄准 ~ O(10K) 到 O(100K) 键。如果键空间大得多,您可以考虑使用散列在内部分离键。如果键带有 date/time 信息,这将特别有用。在这种情况下,您可以 "re-use" 基本上免费处理过去不再活跃的密钥。
源、接收器和外部系统
使用选项标志可以轻松读取压缩文件,但是没有偏移量,TextIO 无法分发此任务。如果您有非常大的文件要读取,在启动管道之前解压缩文件可以提供很好的性能提升。另请查看使用压缩 Avro 等格式。
BackPressure:Beam runners 被设计成能够通过并行工作快速咀嚼。他们可以在多台机器上启动多线程来实现这个目标。这很容易淹没外部系统,尤其是在您进行每个元素的 RPC 调用时。如果无法扩展外部系统,请使用 startBundle / finishBundle 创建批处理以帮助提高每秒调用次数
光速,还是光速.. :-) 避免使用离你的工人很远的水槽和光源。
指标
- 利用 Beam 指标来检测您的管道。