jit*_*npt 5 analytics real-time apache-kafka apache-spark spark-streaming
我想使用Spark Streaming处理来自Kafka的实时数据流。我需要从传入流中计算各种统计信息,并且需要针对持续时间不同的窗口进行计算。例如,我可能需要计算最近5分钟的统计信息“ A”的平均值,同时计算最近1小时的统计信息“ 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))
Run Code Online (Sandbox Code Playgroud)
(ii)运行单独的Spark Streaming应用-每个统计信息一个
问题
对我来说(i)似乎是一种更有效的方法。但是,我对此有一些疑问:
提前致谢
您的 (i) 流看起来很合理,将共享数据,您可以查看WindowedDStream以了解底层表示形式。请注意,您的流当然是惰性的,因此在任何给定时间系统中都只有正在计算的批次。
由于计算平均值时必须维护的状态很小(2 个数字),因此应该没问题。我更担心中位数(这需要一对堆)。
不过,您尚未明确的一件事是,您是否确实需要窗口操作隐含的聚合的更新组件。您streamA维护最近5分钟的数据,每分钟更新一次,并streamB维护最近一小时的数据每10分钟更新一次。
如果您不需要这种新鲜度,那么不需要它当然应该最大限度地减少系统中的数据量。您可以将 astreamA的批次间隔设置为 5 分钟,并streamB从中扣除 a (使用window(Hours(1)),因为 60 是 5 的倍数)。
| 归档时间: |
|
| 查看次数: |
1476 次 |
| 最近记录: |