gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 21:12:35 28 4
gpt4 key购买 nike

我想使用 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/

    28 4 0