我已经通过了这个stackoverflow问题,根据答案,它为批处理间隔创建了一个DStream
,只有一个RDD
。
:
我的批处理间隔是1分钟,Spark Streaming job正在从Kafka Topic中消耗数据。
我的问题是,DStream中可用的RDD是否包含最后一分钟的整个数据?我们是否需要设置任何标准或选项来提取最近一分钟创建的所有数据?
如果我有一个有3个分区的Kafka主题,并且所有3个分区都包含最近一分钟的数据,DStream是否会在所有Kafka主题分区中提取/包含最近一分钟创建的所有数据?
更新:
在这种情况下DStream包含多个RDD?
Spark Streaming DStream正在从一个分区的Kafka主题中消费数据,比如在3个不同的Kafka代理上的3个分区。
DStream中可用的RDD是否包含最近一分钟的全部数据?
不完全是。RDD 仅描述任务提交执行时读取数据的偏移量。这就像Spark中的其他rdd一样,它们只有(?)描述了在提交任务时要做什么以及在哪里找到要处理的数据。
如果你以一种更宽松的方式使用"拉/包含"来表达在某个时刻记录(来自给定偏移量的分区)将被处理,是的,你是对的,整个分钟被映射到偏移量,而偏移量又被映射到Kafka交给处理的记录。
在所有Kafka主题分区?
是的。Kafka不一定需要Spark Streaming/DStream/RDD来处理它。从上一次查询到现在,DStream的rdd请求每个偏移量的topic(s)及其分区的记录。
Spark Streaming的分钟可能与Kafka略有不同,因为DStream的rdd包含偏移量记录,而不是每次记录。
在这种情况下,DStream包含多个RDD?
。
我建议在Spark文档中阅读更多关于DStream
抽象的内容。
Discretized Stream或DStream是Spark Streaming提供的基本抽象。它代表了连续的数据流[…]。在内部,DStream由一系列连续的 rdd 表示。
我想加一个点& & &;不要忘记RDD本身是另一个抽象层,因此它可以被分成更小的块并分布在整个集群中。
考虑到你的问题:
- 是的,在每个批间隔触发后,有一个具有一个RDD的作业。RDD包含前一分钟的所有数据。
- 如果你的作业消耗了更多分区的Kafka流,那么所有的分区都是并行消耗的。因此,结果是来自所有分区的数据都在后续的RDD中处理。
一个被忽视的重要事实是,Kafka对Spark Streaming有多种实现。
一种是基于接收器的方法,它在选定的Worker节点上设置一个接收器并读取数据,将其缓冲,然后分发。
另一种是无接收器的方法,这是非常不同的。它只在运行驱动程序的节点中消耗偏移量,然后在分配任务时,它向每个执行器发送一定范围的偏移量来读取和处理。这样,就没有缓冲(因此没有接收器),并且每个偏移量都由在工作线程上运行的互斥执行器进程消耗。
DStream拉/包含所有Kafka主题分区中最近一分钟创建的所有数据?
在这两种方法中,它都会。当间隔达到1分钟时,它将尝试从Kafka读取数据并将其分散到整个集群中进行处理。
在这种情况下,DStream包含多个RDD
就像其他人说的,它永远不会。
DStream
内流动。