我想使用Spark Streaming处理实时数据流(来自Kafka)。我需要从输入流计算各种统计数据,并且需要为不同持续时间的窗口计算它们。例如,我可能需要计算统计数据的平均值A'最后5分钟,同时计算stat' B'过去1小时。
在这种情况下,使用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)似乎是一种更有效的方法。但是,我对此有一些疑问:
提前致谢
答案 0 :(得分:2)
您的(i)流看起来很合理,会分享数据,您可以查看WindowedDStream以了解基础表示。请注意,您的流当然是懒惰的,因此在任何给定时间,只有计算的批次在系统中。
由于你必须维持平均值计算的状态很小(2个数字),你应该没问题。我更担心中位数(需要一对堆)。
但是,您还没有明白的一件事是,您是否真的需要窗口操作所暗示的聚合的更新组件。您的streamA
维护最后5分钟的数据,每分钟更新,streamB
维持最后一小时每10分钟更新一次。
如果您不需要新鲜度,那么不需要它当然会减少系统中的数据量。您可以拥有一个streamA
,批处理间隔为5分钟,streamB
从中扣除(window(Hours(1))
,since 60 is a multiple of 5)。