【发布时间】:2017-09-28 00:17:58
【问题描述】:
有人能解释一下如何使用大数据技术(如 Storm、Spark 等)对实时流数据执行聚合吗? 对流数据进行计算是没有意义的,因为数据一直在流动
【问题讨论】:
标签: apache-spark bigdata apache-storm
有人能解释一下如何使用大数据技术(如 Storm、Spark 等)对实时流数据执行聚合吗? 对流数据进行计算是没有意义的,因为数据一直在流动
【问题讨论】:
标签: apache-spark bigdata apache-storm
大多数流框架支持“窗口”,它在窗口中收集元组(事件)并将其呈现以进行聚合。广泛支持翻滚窗口和滑动窗口,窗口的单位是计数(元组)和时间。
您可以参考以下链接来了解窗口的概念:
https://www.oreilly.com/ideas/the-world-beyond-batch-streaming-101 https://www.oreilly.com/ideas/the-world-beyond-batch-streaming-102
您可以通过窗口计算最近 N 分钟(可能是秒、小时等)的元组聚合。您可能会觉得操作是批处理,是的,您也可以通过将元组推送到外部存储并使用批处理框架进行一些聚合来实现。
在正常情况下,批处理框架中的聚合将更有效地工作(聚合操作是面向批处理的),但流式框架上的即时聚合不需要外部存储(如果窗口适合内存),也不需要需要额外的批处理框架来执行此操作。
【讨论】:
在流式传输中,数据会不断地流式传输。所以首先,我们需要积累数据。为此,我们使用window。我们首先按指定时间列和时间的窗口对数据进行分组。 Spark 将累积给定时间的数据,然后我们将对分组数据应用聚合。
例如
import spark.implicits._
val words = ... // streaming DataFrame of schema { timestamp: Timestamp, word: String }
// Group the data by window and word and compute the count of each group
val windowedCounts = words.groupBy(
window($"timestamp", "10 seconds"),
$"word"
).count()
全面了解流式聚合refer
【讨论】: