Spark Structured Streaming Source Sink整理

Source源码调用

Structured Streaming Read Records.png

Structured Streaming在Source阶段的调用过程如上图

1.在start时会启动StreamExecution内部属性microBatchThread线程,在线程内部调用runBatches方法;
2.在方法内执行triggerExecutor.execute调用runBatch方法;
3.调用source的getBatch返回具体数据的DataFrame;
4.在各实现Source的类中,获取对应的流数据,以kafkaSource为例,在getBatch中传入start和end的offset参数,通过kafka metadata,获取各topic的parititon在当前时间要获取的offsetRanges,此工作在driver内执行,然后生成KafkaSourceRDD,传入kafka连接参数和offsetRanges等;
5.在RDD的compute方法内,首先调用getOrCreate方法获取CachedKafkaConsumer,并修正offsetRange,生成NextIterator迭代器;
6.在迭代器内调用CachedKafkaConsumer的get方法获取ConsumerRecord,在get内调用fetchData方法,此工作在各executor中执行,在 ConsumerRecord内保存着提前从kafka拉取出来的数据fetchedData,数据都是从其内部获取,当fetchedData为空时,调用kafkaConsumer的poll拉取数据填充;不为空拿到record并进行一系列fail的offset判断,正确后返回ConsumerRecord。

Sink源码调用

Structured Streaming Write Records.png

Structured Streaming在Sink阶段的调用过程如上图

1.前两步与Source阶段相同,在调用getBatch方法得到dataframe后,调用Sink的addBatch方法;
2.仍然以KafkaSink为例,在addBatch方法内调用KafkaWriter的write方法;
3.调用RDD的foreachPartition方法,得到iter后在各个executor中生成KafkaWriteTask执行execute方法;
4.通过CachedKafkaProducer.getOrCreate获取producer,在row中获取topic、key、value值,发送。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容