sparkStreaming内核剖析

本文详细介绍了Spark Streaming中数据从Kafka接收至处理完成的全过程。数据被Receiver接收后存储到缓冲区,由BlockIntervalTimer定期打包成block,并由blockPushingThread推入队列。这些block会被保存在BlockManager中,并将block信息发送到Driver的ReceiverTracker。JobGenerator根据时间间隔从ReceiverTracker获取block,封装成batch,并进一步创建RDD进行并行处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Receiver从kafka中接收的数据都是一条一条的数据,那么接下来,会将这一条一条的数据存储到currnetBuffer(ArrayBuffer),这时有一个线程(BlockIntervalTimer)(每隔一段时间(可配置)将currentBuffer中所有数据打包,封装为一个block),然后将打包好的block推入到一个队列中,这个队列中就是一个一个的block,然后有一个blockPushingThread线程,将block推入到pushArrayBuffer中,这时就有俩个去处,一个是直接存入到BlockManager,另一边就是存入到Driver的ReceiverTracker中,发送到ReceiverTracker,其中会将一个一个的blockId存储到对应的streamId中,而且存入一个HashMap,key就是time

 

关键点:

1. BlockIntervalTImer,会每隔一段时间(默认是200ms),将接收到的数据,打包成一个block

2. 每一个block,都会通过blockManager保存一份,然后还会发送一份blockInfo到receiverTracker上,根据time时间来存储(HashMap)

 

我们的JobGenerator,每隔一段时间(batch interval)的time,就去找ReceiverTracker,将其中的,从上次划分batch的时间,到目前为止的这个batch interval time间隔内的block,给封装为一个batch

 

其次,就会将这个batch中的数据创建RDD,这个RDD中有几个partition呢?,这就是batch和block之间的一个绝对微妙的地方,其实一个batch内,在那段时间封装了几个block,那这几个block,就代表,batch对应的RDD内会有几个partition

 

这个batch对应的RDD的partition的数量,直接决定了数据处理阶段的并行度,所以说,并行度和调优有很大的关系,如果想增加数据处理阶段的性能那么就考虑增加并行度,缩短blockInterval

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值