(9)处理延迟的数据和watermark

  1. 基本概念

事件时间顾名思义就是嵌入在数据事件内部的时间。对很多应用程序来说,可能希望按照事件时间进行处理。例如,你想统计lot设备每分钟产生事件的个数,那么你肯定希望用数据产生的时间,而不是spark接收到数据的时间。可以做如下类比,每个设备中产生的数据就是表中的一行,然后事件时间就是该行里的一个列值。这时候就可以使用基于窗口的聚合函数基于事件时间列进行分组聚合,每个时间窗口就是一个组,每行可以属于多个窗口/组。因此该事件时间窗口聚合查询在静态数据集或者流数据集上定义使用就很一致了,让我们使用起来更简单。

另外,该模型会很自然的处理那些基于事件时间滞后的数据。由于spark 会去更新结果表,那么spark 就能够完全控制当有滞后的数据到达时处理数据然后更新结果表,同时也可以清除旧的聚合状态来限制中间状态的大小。从spark 2.1开始支持了watermark机制,允许用户指定一个数据之后的最大时间阈值,然后允许引擎根据该阈值清理中间状态。

 

2. update sink

数据传输过程中由于网络故障等会有概率延迟,那么这种情况的处理structured streaming和flink类似,都有watermark的概念,当然这个概念只会在事件时间上生效。例如,假如一个word是在12:04产生,但是在12:11被接收到。应用应该使用的时间是12:04而不是12:11去更新12:00-12:10这个窗口。这在我们基于窗口的分组中自然处理的 – structured streaming可以长时间维持部分聚合的中间状态,以便后期数据可以正确更新旧窗口的聚合。如下所示。

 

 但是,为了使查询持续运行,系统必须限制其积累在内存中的中间状态数据量。这意味着系统需要知道何时可以从内存状态中删除旧聚合状态,因为应用程序不会再为该聚合操作接收较晚的数据。为了实现这一点,在Spark 2.1中,引入了watermark概念,这使得引擎可以自动跟踪数据中的当前事件时间,并尝试相应地清除旧状态。可以

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spark Structured Streaming 中,事件时间(Event Time)和水印(Watermark)可以用来处理迟到数据。具体的处理过程如下: 1. 事件时间:Spark Structured Streaming 可以从数据源中获取到每个事件的时间戳,这个时间戳就是事件时间。对于数据源无法提供事件时间的情况,Spark 也提供了可以自定义事件时间的方法。 2. 水印:水印是一种机制,用来衡量每个时间窗口(Window)的延迟程度。在 Spark Structured Streaming 中,可以通过设置一个延迟阈值来生成水印,例如,设置水印为当前事件时间减去 5 分钟。这样,如果一个事件的时间戳比当前水印时间戳还早,那么这个事件就被认为是迟到数据。 3. 迟到数据处理:对于迟到数据,可以通过设置窗口延迟时间来处理。在 Spark Structured Streaming 中,可以使用 window() 函数来定义窗口大小和滑动间隔,同时使用 withWatermark() 函数来定义水印。对于迟到数据,可以设置一个延迟时间,超过这个延迟时间的数据就会被丢弃或者放入到特定的迟到数据处理流中,等待后续处理。 4. 迟到数据处理方式:对于迟到数据处理方式,可以根据具体业务场景来决定。一种常见的方式是将迟到数据保存到外部存储系统中,例如 HDFS 或者 Hive 等,以便后续处理。另一种方式是将迟到数据与当前数据进行合并计算,例如使用窗口函数中的 reduce() 或者 fold() 函数。 总的来说,事件时间和水印是 Spark Structured Streaming 中用来处理迟到数据的重要机制,可以根据具体业务场景来选择合适的处理方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值