spark流媒体应用中不同持续时间的实时多窗口

m3eecexj  于 2021-06-08  发布在  Kafka
关注(0)|答案(1)|浏览(406)

我想处理一个实时数据流(从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德流?还是会有重复的数据?
此外,还有更有效的方法来处理这样的用例。
提前谢谢

qgzx9mmu

qgzx9mmu1#

您的(i)流看起来很合理,将共享数据,您可以查看windoweddstream来了解底层表示。注意您的流当然是懒惰的,因此在任何给定的时间,系统中都只有正在计算的批处理。
因为计算平均值时必须保持的状态很小(2个数字),所以应该可以。我更担心中位数(它需要一对堆)。
不过,有一点您还没有弄清楚,那就是您是否真的需要窗口操作所暗示的聚合的更新组件。你的 streamA 维护最后5分钟的数据,每分钟更新一次,以及 streamB 保持每10分钟更新一次最后一小时。
如果您不需要这种新鲜感,那么不需要新鲜感当然会使系统中的数据量最小化。你可以喝一杯 streamA 每批间隔5分钟 streamB 从中扣除 window(Hours(1)) ,因为60是5的倍数)。

相关问题