继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Spark Structured Streaming Source Sink整理

慕姐8265434
关注TA
已关注
手记 1309
粉丝 222
获赞 1065

Source源码调用

webp

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源码调用

webp

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值,发送。

             




作者:lioversky
链接:https://www.jianshu.com/p/cd240e3f8afe


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP