KafkaSpark流的窗口操作

oxosxuxt  于 2021-06-08  发布在  Kafka
关注(0)|答案(1)|浏览(392)

我试图探索Spark流从Kafka作为来源。根据这个链接,createdirectstream在kafka分区和spark之间有1:1的并行性。这意味着,如果有一个kafka主题有3个分区,那么3个spark执行器将并行运行,每个执行器读取一个分区。
问题
假设在读取数据之后有一个窗口操作。窗口操作是跨分区应用窗口还是在一个分区内应用窗口,也就是说我的批处理间隔是10秒,窗口间隔是50秒。window是否在分区之间累积50秒的数据(如果每个分区50秒内有10条记录,window是否保存30条记录)或并行地在每个分区中累积50秒的数据(如果每个分区50秒内有10条记录,window是否保存10条记录)?
伪代码:
rdd=createdirectstream(…)
rdd.window()
rdd.saveastextfile()//这是将30条记录写入1个文件还是3个文件,每个文件10条记录?
假设我有这个。。。
伪代码:
rdd=createdirectstream()
rdd.action1()
rdd.window()
rdd.action2()
假设,我有3个kafka分区和3个执行器(每个执行器读一个主题)。这会旋转两个作业,因为有两个动作。每个spark执行器都有rdd的分区,action1是并行应用的。现在对于action2,是否会使用同一组执行器(否则,必须再次从kafka读取数据-不好)?

e0bqpujr

e0bqpujr1#

q) 如果有一个kafka主题有3个分区,那么3个spark执行器将并行运行,每个执行器读取一个分区。
更具体地说,将有3个任务提交给spark集群,每个分区一个任务。这些任务的执行位置取决于集群拓扑和位置设置,但通常可以认为这3个任务将并行运行。
q) 假设在读取数据之后有一个窗口操作。窗口操作是跨分区还是在一个分区内应用窗口?
spark的基本模型和spark流的可传递性是,操作是在抽象(用于spark的rdd/数据集,用于spark流的dstream)上声明的,并且在执行级别,这些操作将以分布式方式应用,使用数据的本机分区。
((我不确定这个问题对“跨分区”和“在一个分区内”的区别)。窗口将按分区保留。操作将根据它们自己的语义应用。例如,一个 map 操作将应用于每个分区,而 count 操作将首先应用于每个分区,然后合并为一个结果。))
关于伪代码:

val dstream = createDirectStream(..., Seconds(30))

dstream.window(Seconds(600)) // this does nothing as the new dstream is not referenced any further

val windowDstream = dstream.window(timePeriod) // this creates a new Windowed DStream based on the base DStream 

dstream.saveAsTextFiles() // this writes using the original streaming interval (30 seconds). It will write 1 logical file in the distributed file system with 3 partitions

windowDstream.saveAsTextFiles() // this writes using the windowed interval (600 seconds). It will write 1 logical file in the distributed file system with 3 partitions.

给定此代码(注意命名更改!):

val dstream = createDirectStream(...)

dstream.action1()

val windowDStream = dstream.window(...)

windowDStream.action2()

对于action2,是否会使用同一组执行器(否则,必须再次从kafka读取数据-不好)?
在直接流模型的情况下,每个间隔的RDD不包含任何数据,只包含偏移量 (offset-start, offset-end) . 只有当一个动作被应用时,数据才会被读取。
因此,直接生产者上的加窗数据流只是一系列偏移: Window (1-3) = (offset1-start, offset1-end), (offset2-start, offset2-end), (offset3-start, offset3-end) . 当一个动作被应用到该窗口时,这些偏移量将从kafka中获取,并应用该操作。这并不是问题中暗示的“坏”。这避免了我们必须长时间存储中间数据,并允许我们保留数据上的操作语义。
所以,是的,数据会被再次读取,这是一件好事。

相关问题