Spark Streaming的Event Time和WaterMark理解

本文介绍了EventTime的概念,即事件的实际发生时间,并通过实例详细解释了WaterMark的作用及其实现原理,帮助读者理解如何处理迟到数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

EventTime即事件真正生成的时间。

例如一个用户在10:06点击 了一个按钮。记录在系统中为10:06。

这条数据发送到Kafka,又到了Spark Streaming中处理,已经是10:08了。这个处理的时间就是process Time。


Water Mark即 这个时间点之前的数据都到达了。

例如现在是10:20 ,但是water Mark是 10:10 分,那么认为,10:10之前的数据都已经到达了。 


这个时候,再来一条10:06 的数据,则直接丢弃 了。

但如果来的是10:16的数据,则可以被正确处理。因为10:16 在water mark后面。

### Spark Streaming与Structured Streaming的主要区别及使用场景 #### 1. 核心模型的区别 Spark Streaming基于DStream模型,采用微批处理(micro-batch)的方式进行流式数据的处理[^4]。相比之下,Structured Streaming是基于DataFrame/Dataset API构建的,采用了连续查询(continuous query)模型,能够以真正的流处理方式运行[^1]。 #### 2. 数据处理模式 在Spark Streaming中,数据被划分为固定的时间窗口(batch),每个时间窗口的数据会被当作一个RDD进行处理[^2]。这种方式导致其本质上仍然是批处理的一种形式。而在Structured Streaming中,数据被视为无界表(unbounded table),流处理操作类似于对静态表的操作,支持事件时间(event-time)语义水印(watermark)机制[^4]。 #### 3. API设计与易用性 Spark Streaming提供了类似RDD的低级API,用户需要手动构造DAG执行图,这可能导致代码复杂度较高,并且容易因开发者水平不同而影响执行效率[^4]。Structured Streaming则继承了Spark SQL的高级API,包括DataFrameDataset,使得编写流处理程序更加直观简洁[^4]。 #### 4. 状态管理容错性 Spark Streaming的状态管理较为复杂,需要用户自行确保输入源输出存储的一致性[^4]。Structured Streaming内置了精确一次(exactly-once)语义的支持,简化了状态管理容错机制的设计。 #### 5. 实时性 由于Spark Streaming依赖于固定的batch size,其延迟通常在几百毫秒到几秒钟之间,难以满足对实时性要求极高的场景[^4]。Structured Streaming通过持续查询的方式,可以实现更低的延迟处理[^1]。 #### 6. 批流统一性 Structured Streaming实现了批处理流处理的统一编程接口,这意味着同一个代码既可以用于批处理也可以用于流处理,极大地提高了代码复用性开发效率[^4]。而Spark Streaming则需要分别编写批处理流处理的逻辑。 #### 使用场景 - **Spark Streaming**:适用于对实时性要求相对较低、但需要灵活控制批处理逻辑的场景,例如准实时数据分析或日志监控系统[^2]。 - **Structured Streaming**:适合需要真正实时处理、精确一次语义保障以及批流统一需求的场景,如金融交易监控、物联网数据处理等。 ```python # 示例:Structured Streaming代码示例 from pyspark.sql import SparkSession spark = SparkSession.builder.appName("StructuredStreamingExample").getOrCreate() # 读取Kafka中的流数据 df = spark.readStream.format("kafka") \ .option("kafka.bootstrap.servers", "host:port") \ .option("subscribe", "topic") \ .load() # 对数据进行简单转换 df.selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)") \ .writeStream \ .format("console") \ .start() \ .awaitTermination() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值