手把手+零基础带你玩转大数据流式处理引擎Flink(事件与时间维度分析
- 总体内容
- 不同时间种类
- Event-Time 处理
- Event-Time 处理
- 案例分析
- Watermarks水印
- Watermarks水印的作用
- 状态保存与迁移
- 保存点(Savepoint)
- 总结内容
- 不同时间种类
- Event-Time 处理
- Watermarks水印
- 状态保存与迁移
总体内容
本文主要针对于Flink技术架构中的【事件与时间维度分析】的要点处理模式,包含:不同时间种类、Event-Time的处理、Watermarks水印以及状态保存和迁移。
不同时间种类
在Flink及其他流式处理引擎出现之前,大数据处理引擎只支持Processing-time的处理。如果定义了一个运算窗口,假如将该窗口设定为每小时进行结算,使用Processing-time进行运算时,发现数据引擎将在3点至4点间收集到的数据进行结算。但是实际上,当做报表或者分析结果时,我们更关心的是在3点至4点之间实际产生的数据的输出结果,而想要了解实际数据的输出结果,我们需要采用Event-Time的方式进行处理。这是因为Event-Time 是基于数据的真实时间戳来进行运算处理,在计算窗口时会考虑事件发生的时间,所以能够更加准确地反映出事件发生的真实情况。
在图中,Event-Time指的是事件发生的时间戳。数据在最开始的队列中被接收后,会被划分为不同的批次,随后进行Event-Time Process处理。这一处理过程会根据事件发生的时间戳对数据进行运算。具体来说,每隔一小时,数据都会被划分为一个新的批次。
Event-Time 处理
Event-Time 是基于数据的真实时间戳来进行运算处理。在事件发生的时间上进行 Re-bucketing,将对应时间段(例如3点到4点)的数据放在相应时间的 Bucket 中,并在该时间段结束后产生计算结果。因此,Event-Time 和 Processing-Time 的概念之间的对比存在差异。Processing-Time 指数据到达处理引擎的时间,而不是事件实际发生时间,因此进行处理时往往会导致数据的不准确性。
Event-Time 处理
Event-Time的重要性在于准确地记录引擎输出运算结果的时间,因此可以更加有效地进行数据处理和分析。
案例分析
举个例子,如果一个流式引擎连续24小时在运行、搜集资料,并且在Pipeline中有一个 windows Operator 正在进行运算,每小时能够产生结果。
为了得到准确的结果,在 windows Operator 完成运算并输出运算值的时间点记录 Event-Time 是非常关键的。这个时间点表示该收的数据已经到位,可以进行下一步的数据处理和分析。在实时数据处理中,Event-Time的准确性对于后续数据分析和预测非常重要。
Watermarks水印
Flink实际上是用watermarks来实现Event-Time的功能。Watermarks在Flink中也属于特殊事件,其精髓在于当某个运算值收到带有时间戳“T”的watermarks时就意味着它不会接收到新的数据了。
Flink 中实际上是使用 Watermarks 来实现 Event-Time 的功能。Watermarks 是 Flink 中的一种特殊事件,其功能在于为流处理过程中的事件引入一种时间概念,并且在 Flink 的时间语义中起到关键性的作用。
Watermarks水印的作用
-
Watermarks的作用是当某个运算值收到带有时间戳“T”的 Watermarks 时,就意味着它不会再接收到新的数据了,也就是说它可以开始进行下一步的处理。通过 Watermarks 和 Event-Time 结合起来使用,可以更加准确地处理实时数据,在数据处理效率和准确性上得到更好的保障。
-
使用 Watermarks 的好处在于可以更准确地预估数据的到达时间,从而更加准确地掌握数据处理进展情况。假设预计数据的到达时间与输出结果的时间差为 5 分钟,在Flink中所有的 Window Operator 会搜索 3 点至 4 点的数据,但是由于存在延迟需要再额外等待 5 分钟才能收集完毕4:05分的数据,因此Watermarks的作用就在于在这个时间段内对数据进行处理。
-
当运算值接收到时间戳为4:05的Watermarks 时,才能判定4点钟的数据收集完成,然后才会产出 3 点至 4 点的数据结果。这个时间段的结果是由 Watermarks 来标识的。
状态保存与迁移
在流式处理应用中,有时需要更改应用的逻辑或修复 bug,此时需要将前一个执行状态迁移到新的执行状态,可以通过使用 Flink 的 Savepoint 来实现。同时,如果需要重新定义应用程序的并发度,可以通过更改 Flink 中的并发度参数来重新定义应用程序的并行度。这个参数可以在 Flink 的配置文件中设置,或者在创建 Flink 应用程序时动态指定。
如果需要升级运算集群的版本号,在 Flink 中可以使用升级工具来进行升级操作。升级工具会将现有的运算集群停止,然后将其升级到指定的版本。在升级过程中,Flink 会自动将现有的应用程序状态保存下来,以便升级完成后可以继续进行处理。
保存点(Savepoint)
保存点(Savepoint):一个手动产生的检查点(Checkpoint),保存点记录着流式应用中所有运算元的状态。
在实际的流式处理应用中,Savepoint 的产生非常重要,可以帮助应用实现状态迁移、处理质量的提升等功能。它的实现原理是通过手动在 Checkpoint barrier 流中插入分布式快照点,产生 Savepoint。Savepoint 可以保存在任何位置,并且在变更应用时,可以直接从 Savepoint 恢复执行。
需要注意的是,在从 Savepoint 恢复执行时,时间是持续前进的,因此需要确保恢复到的是最新的数据,才能保证处理结果的一致性。此外,在重新运算时,可以使用 Process Event-Time 或 Event-Time+Buckting 策略,以确保运算结果的一致性。其中,Event-Time 策略适用于窗口大小较小的情况,而 Event-Time+Buckting 策略适用于窗口大小较大或重新运算的数据量较大的情况。
通过合理地使用 Savepoint,我们可以轻松实现流式处理应用的状态管理,从而提高应用的可靠性和处理质量。
总结内容
不同时间种类
Processing-time:在大数据处理引擎只支持Processing-time的情况下,定义运算窗口时可以设定结算时间,例如每小时进行一次结算。但如果使用Processing-time进行运算,会发现所有在3点至4点间收集到的数据只会在下一个结算周期被结算。
对比Processing-time,当我们需要对在3点至4点之间实际产生的数据进行报表或者分析时,使用Processing-time进行运算可能不够准确。相反,我们需要采用Event-Time的方式进行处理。
Event-Time 处理
Event-Time是基于数据的真实时间戳来进行运算处理,因此在计算窗口时会考虑事件发生的时间,能够更准确地反映事件发生的真实情况,从而提供更准确的分析结果。
Watermarks水印
在Flink中实现Event-Time的功能,需要使用watermarks。因为watermarks是一种特殊的事件,它的作用是通知Flink的运算值,在当前时刻之前窗口中的所有事件数据都已经到达,因此不会再接收到新的数据。这样,Flink就能够在安全的情况下处理来自Event-Time的数据。因此,使用watermarks是实现Flink的Event-Time的关键。
状态保存与迁移
Flink中提供了Savepoint来实现状态迁移和处理逻辑更改。在流式处理应用中,有时候需要修改应用的逻辑或修复bug,这时就需要将前一个执行状态迁移到新的执行状态。除此之外,如果需要重新定义应用程序的并发度,也可以通过更改Flink中的并发度参数来实现。这个参数可以在Flink的配置文件中设置,或者在创建Flink应用程序时动态指定。通过调整并行度,可以实现对Flink应用程序的优化。