我想使用 Spark Streaming 处理实时数据流(来自 Kafka)。我需要从传入的流中计算各种统计数据,并且需要为不同持续时间的窗口计算它们。例如,我可能需要计算过去 5 分钟的 stat 'A' 的平均值,同时计算过去 1 小时的 stat 'B' 的中位数。
在这种情况下,使用 Spark Streaming 的推荐方法是什么?以下是我能想到的几个选项:
(i) 拥有来自 Kafka 的单个 DStream,并使用 window() 方法从中创建多个 DStream。对于这些结果 DStream 中的每一个,windowDuration 将根据需要设置为不同的值。例如:
// pseudo-code
val streamA = kafkaDStream.window(Minutes(5), Minutes(1))
val streamB = kafkaDStream.window(Hours(1), Minutes(10))
(ii) 运行单独的 Spark Streaming 应用程序 - 每个统计一个
问题
对我来说(i)似乎是一种更有效的方法。但是,我对此有几个疑问:
数据结构。
卡夫卡数据流?还是会出现数据重复?
提前致谢
最佳答案
您的 (i) 流看起来很合理,会共享数据,您可以查看 WindowedDStream了解底层表示。请注意,您的流当然是惰性的,因此在任何给定时间,系统中都只有正在计算的批次。
由于您为计算平均值而必须保持的状态很小(2 个数字),因此您应该没问题。我更担心中位数(需要一对堆)。
但是,您还没有说清楚的一件事是,您是否真的需要窗口操作隐含的聚合的更新组件。您的 streamA
维护最近5分钟的数据,每分钟更新一次,还有streamB
保持最后一小时每 10 分钟更新一次。
如果您不需要那种新鲜度,那么不需要它当然应该尽量减少系统中的数据量。您可以拥有一个 streamA
批处理间隔为 5 分钟和 streamB
从中扣除(与 window(Hours(1))
, since 60 is a multiple of 5 )。
关于apache-spark - Spark Streaming 应用程序中不同持续时间的多个窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31549745/