Spark Streaming应用程序

时间:2015-07-21 21:15:33

标签: apache-spark real-time analytics apache-kafka spark-streaming

我想使用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)似乎是一种更有效的方法。但是,我对此有一些疑问:

  • 如何在底层表示streamA和streamB 数据结构。
  • 他们会分享数据 - 因为他们来自于 KafkaDStream?或者会有重复数据吗?
  • 此外,是否有更有效的方法来处理这种用例。

提前致谢

1 个答案:

答案 0 :(得分:2)

您的(i)流看起来很合理,会分享数据,您可以查看WindowedDStream以了解基础表示。请注意,您的流当然是懒惰的,因此在任何给定时间,只有计算的批次在系统中。

由于你必须维持平均值计算的状态很小(2个数字),你应该没问题。我更担心中位数(需要一对堆)。

但是,您还没有明白的一件事是,您是否真的需要窗口操作所暗示的聚合的更新组件。您的streamA维护最后5分钟的数据,每分钟更新streamB维持最后一小时每10分钟更新一次

如果您不需要新鲜度,那么不需要它当然会减少系统中的数据量。您可以拥有一个streamA,批处理间隔为5分钟,streamB从中扣除(window(Hours(1))since 60 is a multiple of 5)。