我已经讨论了这个stackoverflow问题,根据它创建的答案 DStream
只有一个 RDD
对于批处理间隔。
例如:
我的批处理间隔是1分钟,spark流式处理作业正在使用来自kafka主题的数据。
我的问题是,dstream中可用的rdd是否提取/包含最后一分钟的全部数据?我们是否需要设置任何条件或选项来提取最近一分钟创建的所有数据?
如果我有一个带有3个分区的kafka主题,并且所有3个分区都包含最后一分钟的数据,那么dstream是否会在所有kafka主题分区中提取/包含最后一分钟创建的所有数据?
更新:
在这种情况下,dstream包含多个rdd?
3条答案
按热度按时间qacovj5a1#
我建议多读一些关于
DStream
spark文档中的抽象。离散流或数据流是spark流提供的基本抽象。它表示连续的数据流[…]。在内部,数据流由一系列连续的RDD表示。
我想补充一点——不要忘记rdd本身是另一个抽象层,因此它可以被划分成更小的块并分布在集群中。
考虑到你的问题:
是的,在每个批间隔激发之后,有一个具有一个rdd的作业。这个rdd包含了前一分钟的所有数据。
如果您的作业使用具有更多分区的kafka流,则所有分区都将并行使用。因此,结果是来自所有分区的数据在随后的rdd中被处理。
uyhoqukh2#
spark流式数据流正在消耗来自已分区的kafka主题的数据,例如,在3个不同的kafka代理上的3个分区。
dstream中可用的rdd是否提取/包含过去一分钟的全部数据?
不完全是。rdd只描述提交任务执行时从中读取数据的偏移量。这就像spark中的其他RDD一样,它们只是(?)任务提交时要做什么以及在何处查找要处理的数据的描述。
但是,如果您以更宽松的方式使用“pulls/contains”来表示在某个时刻(来自给定偏移量的分区)将要处理的记录,是的,您是对的,整个分钟都Map到偏移量,而偏移量又Map到Kafka交给处理的记录。
在所有的Kafka主题分区中?
对。Kafka不一定要用spark streaming/dstream/rdd来处理它。从上次查询到现在,数据流的rdds请求记录来自主题及其每个偏移的分区。
对于kafka来说,spark流的分钟可能略有不同,因为dstream的rdd包含偏移量的记录,而不是每次的记录。
在这种情况下,dstream包含多个rdd?
从未。
mlmc2os53#
一个被忽视的重要事实是kafka有多个spark流的实现。
一种是基于接收器的方法,它在选定的工作节点上设置接收器,读取数据,缓冲数据,然后分发数据。
另一种是无接收器方法,这是完全不同的。它只消耗运行驱动程序的节点中的偏移量,然后在分配任务时,它向每个执行器发送一系列要读取和处理的偏移量。这样,就没有缓冲(因此,接收器较少),并且每个偏移量都由工作进程上运行的互斥执行器进程使用。
dstream拉入/包含所有kafka主题分区中最近一分钟创建的所有数据?
在这两种方法中,它都会。当一分钟间隔命中时,它将尝试从kafka读取数据并将其分布到集群中进行处理。
在这种情况下,dstream包含多个rdd
正如其他人所说,从来没有。只有一个rdd在
DStream
每隔一段时间。