首页 > 解决方案 > 为什么在 Scio 中您更喜欢聚合而不是 groupByKey?

问题描述

从:

https://github.com/spotify/scio/wiki/Scio-data-guideline

“比 groupByKey 更喜欢 combine/aggregate/reduce 转换。请记住,reduce 操作必须是关联的和可交换的。”

为什么特别喜欢聚合而不是 groupByKey?

标签: scalaapache-beamdataflowspotify-scio

解决方案


组合、聚合和归约转换优于 groupByKey,因为前者在管道执行期间内存效率更高。这是由于在 Apache Beam 中实现了原语GroupByKey和转换。Combine这个问题的答案不一定是 Scio 特有的。

GroupByKey要求所有键值对都保留在内存中,这可能会导致OutOfMemoryErrors. 每个窗口的所有键值对都保留在内存中。groupByKey使用 Beam 的原始GroupByKey变换。

聚合消除了将所有值保存在内存中的需要,因为值在执行转换期间不断组合/减少。值以不确定的顺序组合/减少,这就是为什么所有组合/减少操作必须是关联的。Scio 的实现aggregateByKey使用 Beam 的原始Combine变换。

参考:
1. Scio groupByKey
2. Scio aggregateByKey
3. Apache Beam GroupByKey
4. Apache Beam Combine
5. Google Cloud Dataflow Combine


推荐阅读