时间模型
Flink提供了三种时间模型,EventTime、IngestionTime、WindowProcessingTime如下图:
EventTime:
EventTime是事件在现实世界中发生的时间,ProcessingTime是Flink系统处理该事件的时间。事件时间是每条事件在它产生的时候记录的时间,该时间记录在事件中,在处理的时候可以被提取出来。小时的时间窗处理将会包含事件时间在该小时内的所有事件,而忽略事件到达的时间和到达的顺序。事件时间处理通常存在一定的延时,因此自然的需要为延时和无序的事件等待一段时间。因此,使用事件时间编程通常需要与处理时间相结合。
IngestionTime:
摄入时间是事件进入flink的时间,在source operator中,每个事件拿到当前时间作为时间戳,后续的时间窗口基于该时间。
摄入时间在概念上处于事件时间和处理时间之间,与处理时间相比稍微昂贵一点,但是能过够给出更多可预测的结果。因为摄入时间使用的是source operator产生的不变的时间,后续不同的operator都将基于这个不变的时间进行处理,但是处理时间使用的是处理消息当时的机器系统时钟的时间。与事件时间相比,摄入时间无法处理延时和无序的情况,但是不需要明确执行如何生成watermark。在系统内部,摄入时间采用更类似于事件时间的处理方式进行处理,但是有自动生成的时间戳和自动的watermark。
ProcessingTime:
流处理程序使用该时间进行处理的时候,所有的操作(类似于时间窗口)都会使用当前机器的时间,例如按照小时时间窗进行处理,程序将处理该机器一个小时内接收到的数据。处理时间是最简单的概念,不需要协调机器时间和流中事件相关的时间。他提供了最小的延时和最佳的性能。但是在分布式和异步环境中,处理时间不能提供确定性,因为它对事件到达系统的速度和数据流在系统的各个operator之间处理的速度很敏感。
Watermark:
flink中检测事件时间处理进度的机制是watermark,watermark跟事件一样在流中进行传输并携带一个时间戳t。一个watermark(t)声明了在流中的事件时间有一个到达时间t,意味着流中应该不再有时间比t小的事件(例如某个事件的时间戳比watermark的时间戳老)。watermark主要用来处理事件时间戳乱序的事件流。
金融数据的特点:
金融数据主要指每秒产生的实时交易数据,这些数据需要根据不同的维度,如1min,5min,15min,30min,60min,日,周、月、年等进行价格高开低收的聚合,然后在金融软件上进行kline展示。下面的例子是将每秒的交易数据通过flink进行分钟维度的切分,具体聚合和存储的部分将在后面的文章中讲述。
一个模拟生成金融数据的源:
生成的数据格式如下图:
在flink端的处理代码为:
设置的窗口长度为1min,处理结果为:
可见每分钟接收到的数据都会落在同一个窗口中,即使数据有乱序,发生在前面的数据延时到达了也没关系,因为这里的watermark设置了5s钟的延时机制,在5s钟延时以内的数据会正常进入属于自己的窗口,5s钟以上的延时数据则不会被处理。