Spark实时(二):StructuredStreaming编程模型-LMLPHP

文章目录

StructuredStreaming编程模型

一、基础语义

二、事件时间和延迟数据

三、​​​​​​​​​​​​​​容错语义


StructuredStreaming编程模型

一、基础语义

Structured Streaming处理实时数据思想是将实时数据看成一张没有边界的表,数据源源不断的追加到这张表中,这可以让我们能像处理批数据一样处理实时数据。如下图所示,每条实时数据到来之后都对应“无界表”中的一条数据追加到表中。

Spark实时(二):StructuredStreaming编程模型-LMLPHP

以WordCount为例,Spark会针对每次增量的数据进行计算,将结果输出出来,如下图所示: 

Spark实时(二):StructuredStreaming编程模型-LMLPHP

 

注意:StructuredStreaming并不会将每次输出的数据物化存储起来,而是每次计算都将结果状态保存起来,下个批次计算是基于当前批次数据和状态值进行计算,计算完成后会把当前批次数据丢弃。 

二、​​​​​​​​​​​​​​事件时间和延迟数据

对于流式数据处理时,我们更希望使用事件时间evnet time来对数据进行窗口划分,事件时间一般嵌入到数据本身,是数据中的一个列,例如:Iot设备产生实时数据时,我们对这些数据进行处理时,我们希望使用事件产生的时间,即:event time,而不希望使用Spark接收这些事件的时间进行窗口划分数据分析。Structured Streaming中事件时间是实时增量数据行中的一个列值,Structured Streaming可以针对这个列值进行窗口划分对数据进行聚合处理,这种基于事件时间的窗口划分可以将流数据处理的更加精准。

此外,Structured Streaming 基于事件时间处理数据时还支持对延迟数据的处理,当有延迟数据到达时,Structured Streaming可以基于事件时间找到对应的窗口对数据进行更新。从Spark2.1开始支持Watermarking,Watermarking允许用户指定数据延迟时间的阈值,并根据阈值来自动清理旧状态。

三、​​​​​​​​​​​​​​容错语义

Structured Streaming提供端到端恰好消费一次的语义。在Structured Streaming中有Source、Sink和执行引擎来可靠的跟踪数据处理的进度,其原因是将处理的每个流数据源都看做有偏移量(类似Kafka offset)来跟踪流中的数据位置,Structured Streaming使用checkpoint和WAL预写日志机制来记录每次触发处理的数据偏移范围,Sink在内部也被设计为幂等操作,在发生故障时Structured Streaming根据以上来确保端到端精准消费一次的语义。

在Structured Streaming中向HDFS中写入数据、ForeachSink自定义写出(写出需支持幂等写出,如RDBMS写出)已经实现“exactly-once”端到端语义,向Kafka写出、console写出目前不支持“exactly-once”端到端语义。


  • 📢博客主页:https://lansonli.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 Lansonli 原创,首发于 CSDN博客🙉
  • 📢停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨
07-24 11:26