零基础入门 Spark
吴磊
前 FreeWheel 机器学习研发经理
19171 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 38 讲
零基础入门 Spark
15
15
1.0x
00:00/00:00
登录|注册

31|新一代流处理框架:Batch mode和Continuous mode哪家强?

你好,我是吴磊。
在上一讲,我们通过“流动的 Word Count”示例,初步结识了 Structured Streaming,并学习了流处理开发三要素,也就是 Source、流处理引擎与 Sink。
今天这一讲,让我们把目光集中到 Structured Streaming,也就是流处理引擎本身。Structured Streaming 与 Spark MLlib 并列,是 Spark 重要的子框架之一。值得一提的是,Structured Streaming 天然能够享受 Spark SQL 提供的处理能力与执行性能,同时也能与其他子框架无缝衔接。因此,基于 Structured Streaming 这个新一代框架开发的流处理应用,天然具备优良的执行性能与良好的扩展性。
知己知彼,百战百胜。想要灵活应对不同的实时计算需求,我们就要先了解 Structured Streaming 的计算模型长啥样,搞清楚它如何应对容错、保持数据一致性。我们先从计算模型说起。

计算模型

当数据像水流一样,源源不断地流进 Structured Streaming 引擎的时候,引擎并不会自动地依次消费并处理这些数据,它需要一种叫做 Trigger 的机制,来触发数据在引擎中的计算。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Structured Streaming是Spark的重要子框架之一,具有良好的执行性能和扩展性。文章介绍了Structured Streaming的计算模型和容错机制。在计算模型方面,Structured Streaming支持Batch mode和Continuous mode两种计算模型。Batch mode将连续的数据流切割为离散的数据微批,触发Spark Job进行处理,适用于高吞吐量但延迟较高的场景;而Continuous mode以事件/消息为粒度,采用常驻作业来处理数据流,具有低延迟但吞吐量较低。在容错机制方面,Structured Streaming结合幂等的Sink,能够提供Exactly once的容错能力,保证数据的不重不漏。Batch mode利用Checkpoint机制实现容错,将Micro-batch的元信息存储到文件系统路径,以恢复数据流的“断点续传”,但会带来一定的处理延迟。Continuous mode则采用不同的实现方式来实现容错。总的来说,Structured Streaming适用于不同的实时计算需求,读者可以根据具体场景选择合适的计算模型和容错机制。Continuous mode通过Epoch Marker机制实现容错,避免微批处理带来的延迟,提供更低的处理延迟。Continuous mode还支持非聚合类操作,但暂时不支持聚合类操作,这一点需要读者特别注意。整体来看,文章深入浅出地介绍了Structured Streaming的计算模型和容错机制,为读者提供了全面的了解和选择指南。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《零基础入门 Spark》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(6)

  • 最新
  • 精选
  • 刘启涛
    课后习题: 我觉得先消费再记录的方式是可以实现,但是如果记录的时候出现异常(hdfs写数据网络抖动),可能会导致数据重复消费,这种方式“Exactly Once”的准确性没有先记录、再消费数据高。 老师,我这里还有一个问题,Continuous mode是处理完数据异步记录日志,感觉很难保证“刚好一次”

    作者回复: 老弟思考的很到位~ 从实现上来说,先消费再记录的方式,肯定是可以实现的。不过这样一来,会有几方面的问题: 1)首先是老弟提到的,数据处理失败,就存在一个重试的问题,如果是先写WAL(数据+元数据),再消费,因为数据已经落盘(本地或是HDFS)缓存了,因此再消费一遍,很容易,也很方便。但如果反过来,先消费、再写日志,那就得从Source重新拉数据,网络开销是一方面,再者,为了确保拉取的是同一份数据,实际上也需要维护元数据,来管理offsets 2)再一个,即便是没有失败重试的问题,在batch mode下,一个批次的数据,还是以批次为粒度,来触发一个job,这中间的任务调度延迟,其实仅靠先处理数据,是去不掉的。这个跟Continuous mode很不一样,Continuous mode是常驻的job,因此不存在这个问题。 关于老弟说的“Exactly once”,严格来说,Spark自己不能保证“Exactly once”,但它可以做到“At least once”,再结合幂等的Sink,端到端可以做到“Exactly once”。但是就Structured Streaming来说,它自己只能做到“At least once”。

    2021-12-02
    5
  • 六月的余晖
    老师,可以比较一下Continuous mode和Flink 吗

    作者回复: 好问题,先说结论,虽然咱们的主题是Spark,不过就追求实时性的流处理来说,我还是会推荐Flink。 Flink的Kappa架构,天然对流处理友好,尤其是对于实时性的支持。因为出发点就是流计算,因此随着Flink的发展、迭代,开发API也越来越丰富,功能也越来越完善。 而Spark不同,Spark实际上是Lambda架构,天然以批处理为导向,最初的流处理,也是微批模式,也就是Micro-batch,咱们分析了,微批模式,没法保证实时性,不过对于高吞吐,倒是比较友好。尽管Spark官方推出了Continuous mode,但是目前功能、API各方面还没有那么完善,至少现在为止,Continuous mode还不支持聚合操作,仅这一点,限制就太大了,试问现在的数据处理,有多少逻辑是不需要聚合操作的呢?太少了。因此,Continuous mode,在我看来,更多的是一种尝试和探索,至于后续能否提供更多的功能与能力,还要看Spark社区对于这方面的发力。 不过,从课程内容的角度,我们还是得让大家知道,Spark社区推出了这么一种Continuous mode。一方面是让大家知道有这么回事,再者和Micro batch mode是个对比,有利于大家做对比学习,加深印象 但是就能力来说,从实时性和功能完善的角度出发, 我觉得,还是Flink更加实用

    2021-11-22
    2
  • Geek_995b78
    老师,后面课程没有spark streaming内容的讲解吗

    作者回复: 课程主要围绕Structure Streaming哈

    2021-11-22
  • Geek_995b78
    老师,虽然kafka幂等性不能保证跨分区的原子写入,但是kafka还支持事务呀

    作者回复: 感谢老弟提醒,上一个留言,一起回复了哈~

    2021-11-22
  • Geek_995b78
    老师,0.11版本后的kafka,引入了幂等性机制呀,文中问什么说kafka不是幂等的呢

    作者回复: 感谢老弟的提醒,原文的描述确实有问题~ 新版本的Kafka确实在Producer级别支持幂等和事务性,结合transactional id + PID + sequence number,能做到跨会话、跨Topic Partition做到幂等。再结合Structured Streaming对于Event time、Late Data和Watermark的支持,以及WAL和Checkpoint机制,理论上,Structured Streaming + Kafka确实可以做到Exactly once。 原文的表述有误,当时脑子里想的是老的Spark Streaming,由于不支持事件时间,仅支持Processing time,而一般的时间窗口,都会有group by这些带状态的计算。因此即便是结合Kafka的幂等性,也很难做到Exactly once的Delivery。 再次感谢老弟,我回头抽空调整下原文的描述,谢谢~

    2021-11-22
  • Geek1185
    为什么batch mode的WAL不做成异步的形式呢?
    2023-02-06归属地:北京
收起评论
显示
设置
留言
6
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部