apache-spark - Spark Streaming 应用程序中不同持续时间的多个窗口

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

我想使用 Spark Streaming 处理实时数据流(来自 Kafka)。我需要从传入的流中计算各种统计数据,并且需要为不同持续时间的窗口计算它们。例如,我可能需要计算过去 5 分钟的 stat 'A' 的平均值,同时计算过去 1 小时的 stat '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))

(ii) 运行单独的 Spark Streaming 应用程序 - 每个统计一个

问题

对我来说(i)似乎是一种更有效的方法。但是,我对此有几个疑问:
  • 流A和流B如何在底层表示
    数据结构。
  • 他们会共享数据吗?因为他们来自
    卡夫卡数据流?还是会出现数据重复?
  • 此外,是否有更有效的方法来处理此类用例。

  • 提前致谢

    最佳答案

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

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

    但是,您还没有说清楚的一件事是,您是否真的需要窗口操作隐含的聚合的更新组件。您的 streamA维护最近5分钟的数据,每分钟更新一次,还有streamB保持最后一小时每 10 分钟更新一次。

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

    关于apache-spark - Spark Streaming 应用程序中不同持续时间的多个窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31549745/

    相关文章:

    java - SQLcontext 将字符串字段更改为 Long : Spark 1. 5

    apache-spark - 由于 DeadlineExceededException,Spark 作业无法写入 Alluxio

    java - scheduledExecutorService.scheduleAtFixedRate() 方法如何保证实时执行?

    PHP - 实时通知系统 - 支持所有浏览器和设备

    python - 从socketIo python发出事件

    javascript - Google Analytics API 以可读格式输出数据

    java - Spark 异常 : Task failed while writing rows

    scala - Spark : difference of semantics between reduce and reduceByKey

    hadoop - 点击流数据分析

    hadoop - FlumeNG 中的正则表达式配置