为什么在 Scio 中你更喜欢聚合而不是 groupByKey?

Why in Scio do you prefer aggregate over groupByKey?

发件人:

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

"Prefer combine/aggregate/reduce transforms over groupByKey. Keep in mind that a reduce operation must be associative and commutative."

为什么人们更喜欢聚合而不是 groupByKey?

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

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

聚合消除了将所有值保存在内存中的需要,因为在执行转换期间值不断 combined/reduced。值是 combined/reduced 的非确定性顺序,这就是为什么所有 combine/reduce 操作必须是关联的。 Scio 的 aggregateByKey 实现使用 Beam 的原语 Combine transform.

参考文献:
1. Scio groupByKey
2. Scio aggregateByKey
3.阿帕奇光束 GroupByKey
4.阿帕奇光束 Combine
5. Google 云数据流 Combine