Apache Spark Streaming - reduceByKey、groupByKey、aggregateByKey 或 combineByKey?

Apache Spark Streaming - reduceByKey, groupByKey, aggregateByKey or combineByKey?

我有一个应用程序在 10 分钟的时间段内生成多个会话,每个会话包含多个事件(Avro 格式)- 每个事件都将包含一个会话 ID,可用于查找所有会话数据。收集完所有这些数据后,我想创建一个会话对象。

我的计划是在 Spark Streaming 中使用 window 来确保内存中有数据可供处理 - 除非有任何其他建议非常适合解决我的问题。

阅读 Apache Spark 文档后,我似乎可以使用各种不同的 API 来实现这一点,但我正在努力找出哪一个最适合我的问题 - 到目前为止我遇到过 reduceByKey / groupByKey / aggregateByKey / combineByKey.

为了向您提供有关会话/事件数据的更多详细信息,我希望在 100 万个活动会话区域内的任何位置,每个会话在 10 分钟内产生 5/10 个事件。

最好了解哪种方法适合收集所有会话事件并生成单个会话对象。

提前致谢。

@phillip 感谢您提供详细信息。让我们详细了解每个键:

(1)。 groupByKey - 它可以帮助使用任何键进行排名、排序甚至聚合。性能方面它比较慢,因为不使用组合器。 groupByKey() 只是根据键

对数据集进行分组

如果您要进行任何聚合,如求和、计数、最小值、最大值,那么这不是可取的。

(2)。 reduceBykey - 它仅支持聚合,如 sum、mix、max。使用组合器比 groupbykey 更快。洗牌的数据非常少。 reduceByKey() 类似于分组+聚合。 当我们运行大数据集时可以使用reduceByKey。

(3)。 aggregateByKey - 与 reduceBykey 类似,它仅支持 sum、mix、max 等聚合。在逻辑上与 reduceByKey() 相同,但它可以让你 return 产生不同的类型。换句话说,它允许您将输入作为类型 x 并将聚合结果作为类型 y。例如 (1,2),(1,4) 作为输入,(1,”six”) 作为输出

我相信你只需要分组而不需要聚合,那么我相信你别无选择然后使用 groupBykey()