DStream 的 RDD 是否一次性提取为批处理间隔创建的全部数据?

Does DStream's RDD pull entire data created for the batch interval at one shot?

我已经完成了 Whosebug 问题,根据答案,它创建了一个 DStream,批处理间隔只有一个 RDD

例如:

我的批处理间隔是 1 分钟,Spark Streaming 作业正在使用来自 Kafka 主题的数据。

我的问题是,DStream pulls/contains 中的 RDD 是否提供最后一分钟的全部数据?我们是否需要设置任何条件或选项来提取最后一分钟创建的所有数据?

如果我有一个包含 3 个分区的 Kafka 主题,并且所有 3 个分区都包含最后一分钟的数据,那么 DStream pulls/contains 所有 Kafka 中最后一分钟创建的所有数据主题分区?

更新:

在哪种情况下 DStream 包含多个 RDD?

我建议阅读 Spark documentation 中有关 DStream 抽象的更多信息。

Discretized Stream or DStream is the basic abstraction provided by Spark Streaming. It represents a continuous stream of data [...]. Internally, a DStream is represented by a continuous series of RDDs.

我要补充一点——不要忘记 RDD 本身是另一个抽象层,因此它可以分成更小的块并分布在集群中。

考虑您的问题:

  • 是的,在每个批处理间隔触发后,有一个作业带有一个 RDD。而这个 RDD 包含前一分钟的所有数据。
  • 如果您的作业使用具有更多分区的 Kafka 流,则所有分区都是并行使用的。所以结果是所有分区的数据都在后续的RDD中处理。

Spark Streaming DStream 正在使用分区的 Kafka 主题中的数据,比如 3 个不同的 Kafka 代理上的 3 个分区。

Does the RDD available in DStream pulls/contains the entire data for the last one minute?

不完全是。 RDD only 描述了提交任务执行时读取数据的偏移量。就像 Spark 中的其他 RDD 一样,它们只是 (?) 描述提交任务时要做什么以及在何处查找要处理的数据。

但是,如果您以更宽松的方式使用 "pulls/contains" 来表示在某个时候将处理记录(来自给定偏移量的分区),是的,您是对的,整个分钟映射到偏移量,偏移量又映射到 Kafka 移交处理的记录。

in all the Kafka topic partitions?

是的。处理它的 Kafka 不一定是 Spark Streaming / DStream / RDD。从上次查询到现在,DStream 的 RDD 从主题及其每个偏移量的分区请求记录。

Kafka 的 Spark Streaming 分钟可能略有不同,因为 DStream 的 RDD 包含偏移量记录而不是每次记录。

In which case DStream contains more than one RDD?

从来没有。

一件被忽视的重要事情是 Kafka 有多种 Spark Streaming 实现。

一种是基于接收器的方法,它在选定的 Worker 节点上设置接收器并读取数据、缓冲数据然后分发。

另一种是receiver-less 方法,这是完全不同的。它仅消耗节点 运行 驱动程序中的 offsets,然后当它分发任务时,它向每个执行程序发送一个偏移量范围以供读取和处理。这样,就没有缓冲(因此,无接收器),并且每个偏移量都被工作进程上的互斥执行进程 运行 消耗。

DStream pulls/contains all the data created for the last one minute in all the Kafka topic partitions?

在这两种方法中,它都会。一旦一分钟的间隔命中,它将尝试从 Kafka 读取数据并将其分布在集群中进行处理。

In which case DStream contains more than one RDD

正如其他人所说,它永远不会。在给定的时间间隔内,只有一个 RDD 在 DStream 中流动。