为了账号安全,请及时绑定邮箱和手机立即绑定

Spark Structured Streaming Source Sink整理

标签:
Spark

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


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消