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