3

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

例如:

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

我的问题是,DStream 中可用的 RDD 是否提取/包含最后一分钟的全部数据?我们需要设置任何标准或选项来提取最后一分钟创建的所有数据吗?

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

更新:

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

4

3 回答 3

3

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

DStream 中可用的 RDD 是否提取/包含最后一分钟的全部数据?

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

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

在所有 Kafka 主题分区中?

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

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

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

绝不。

于 2016-11-14T15:36:40.457 回答
2

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

Discretized StreamDStream是 Spark Streaming 提供的基本抽象。它代表连续的数据流[...]。在内部,一个DStream由一系列连续的RDD表示。

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

考虑到您的问题:

  • 是的,在每个批次间隔触发后,都会有一个带有一个RDD的作业。这个RDD包含前一分钟的所有数据。
  • 如果您的作业使用具有更多分区的 Kafka 流,则所有分区都将并行使用。所以结果是所有分区的数据都在后续的RDD中处理。
于 2016-11-13T22:27:03.960 回答
1

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

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

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

DStream 提取/包含所有 Kafka 主题分区中最后一分钟创建的所有数据?

在这两种方法中,它都会。每隔一分钟,它将尝试从 Kafka 读取数据并将其传播到集群中进行处理。

在这种情况下,DStream 包含多个 RDD

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

于 2016-11-16T07:31:32.383 回答