我想处理一个实时数据流(从Kafka)使用Spark流。我需要从传入流中计算各种统计信息,并且需要为不同持续时间的窗口计算它们。例如,我可能需要计算过去5分钟统计‘a’的平均值,同时计算过去1小时统计‘b’的中值。
在这种情况下,使用spark流的推荐方法是什么?下面是我能想到的几个选择:
(i) 从kafka获得一个数据流,并使用window()方法从中创建多个数据流。对于每个生成的数据流,windowduration将根据需要设置为不同的值。如:
// pseudo-code
val streamA = kafkaDStream.window(Minutes(5), Minutes(1))
val streamB = kafkaDStream.window(Hours(1), Minutes(10))
(ii)运行单独的spark流媒体应用程序-每个stat一个
问题
在我看来,这是一种更有效的方法。但是,我对此有几个疑问:
streama和streamb如何在底层数据结构中表示。
他们会共享数据吗?因为他们来自Kafka德流?还是会有重复的数据?
此外,还有更有效的方法来处理这样的用例。
提前谢谢
1条答案
按热度按时间qgzx9mmu1#
您的(i)流看起来很合理,将共享数据,您可以查看windoweddstream来了解底层表示。注意您的流当然是懒惰的,因此在任何给定的时间,系统中都只有正在计算的批处理。
因为计算平均值时必须保持的状态很小(2个数字),所以应该可以。我更担心中位数(它需要一对堆)。
不过,有一点您还没有弄清楚,那就是您是否真的需要窗口操作所暗示的聚合的更新组件。你的
streamA
维护最后5分钟的数据,每分钟更新一次,以及streamB
保持每10分钟更新一次最后一小时。如果您不需要这种新鲜感,那么不需要新鲜感当然会使系统中的数据量最小化。你可以喝一杯
streamA
每批间隔5分钟streamB
从中扣除window(Hours(1))
,因为60是5的倍数)。