【问题标题】:Spark Streaming reduceByKeyAndWindow exampleSpark Streaming reduceByKeyAndWindow 示例
【发布时间】:2018-03-01 03:31:42
【问题描述】:

来自https://spark.apache.org/docs/latest/streaming-programming-guide.html#window-operations 它说reduceByKeyAndWindow“返回一个新的单元素流,它是通过使用 func 在滑动间隔内聚合流中的元素而创建的”

给出的示例是,如果我们希望每 10 秒生成最后 30 秒数据的字数。

我对此感到困惑的部分是reduceByKeyAndWindow 究竟是如何工作的。因为一个窗口流是由多个 RDD 组成的。在这种情况下,reduceByKeyAndWindow 不会只返回一个 RDD 流而不是一个 RDD 吗?

【问题讨论】:

    标签: java apache-spark spark-streaming


    【解决方案1】:

    Spark Streaming 是一个基于微批处理的流媒体库。这意味着流数据根据称为批处理间隔的时间片分为批处理。每一批都被转换成一个 RDD,这个连续的 RDD 流被表示为 DStream。

    有时我们需要每 m 秒知道最后 n 秒内发生了什么。举个简单的例子,假设批处理间隔是 10 秒,我们需要每 30 秒知道最后 60 秒发生了什么。这里 60 秒称为窗口长度和 30 秒滑动间隔。假设前 6 批是 A、B、C、D、E、F,它们是第一个窗口的一部分。 30 秒后将形成第二个窗口,其中包含 D、E、F、G、H、I。如您所见,第一个和第二个窗口之间共有 3 个批次。

    关于窗口要记住的一点是,Spark 会在内存中保存整个窗口。在第一个窗口中,它将使用联合运算符将 RDD A 组合到 F 以创建一个大 RDD。这将占用 6 倍的内存,如果这就是您所需要的就可以了。因此,在 ereduce key by window 中,一旦将数据统一到一个 rdd 中,它就会按 key 应用 reduce 并在每个滑动间隔返回 dstream。

    【讨论】:

    • 如果我正确理解您的答案,这意味着当您进行窗口操作时,只会根据当前窗口生成一个 RDD?
    • 有没有一个很好的方法来计算一个流中的 RDD 的数量。
    • @AlwaysNull 是的,每个窗口只创建一个 rdd。
    • 这意味着对流的任何操作都只是在一个巨大的 RDD 上对吗?
    • 是的,它是针对一个rdd,它在集群中的节点之间进行分区
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    • 2016-03-24
    • 2020-03-19
    • 1970-01-01
    • 2017-02-21
    • 2022-01-13
    • 2016-06-13
    相关资源
    最近更新 更多