欢迎关注公众号——《数据三分钟》

一线大厂的师兄师姐结合自己的工作实践,将数据知识浅显道来,每天三分钟,助你成为数据达人。还有面试指导和内推机会。

       上一节说到,实时计算中的数据可以看成无界流(unbounded stream),没有确切的结束时间,就像水流一样——逝者如斯夫,不舍昼夜。这也是实时数据区别于离线数据的地方,离线数据是有界的,有确定的开始时间和结束时间,因此所有的离线计算都是基于确定的有限数据展开的。

一、实时计算中时间的重要性

       离线计算模式下,计算引擎摄入全量的需要计算的有界数据,按照确定的维度进行聚合,所有的计算过程都是确定的。但是在实时计算中却截然不同,首先实时计算是持续不断进行的,由于网络波动等情况不可避免,数据最终到达算子的时间和数据真实产生的时间并不一致,那么flink引擎以什么为计算的基准呢?又怎么去触发计算呢?这里就不得不提到窗口机制了,它是经典的无界数据的分组计算方式。流式计算中的数据是一条一条源源不断产生的记录,每一条记录都会有产生的时间、进入Flink引擎的时间和到达算子的时间,这些时间分别对应Event time、Ingestion time、Processing time,Flink就是按照这些时间对数据进行分组和计算的。

二、事件时间(Event time)

       事件时间是记录数据真实产生时候的时间,它是每一条数据在物理世界中的先后顺序,也是计算中首选的时间基准!但是选用事件时间也不得不面临一些问题:首先,事件时间是数据产生时候的时间,并非被Flink计算时候的时间,也就是说,数据在被计算的时候一定会不可避免地发生错乱,我们如何即保有数据最真实的产生时间,有能够兼容数据在传输过程中的乱序问题,这就可以采用watermark机制(后续文章会详细写到)。

三、处理时间(Processing time)

       处理时间是数据进入Flink算子的时间,也就是计算节点机器的本地时间,这种时间可以带来最好的性能和最低的延迟。但是,这样的计算也最不具准确性,当我们回跑数据时,难以保证数据的一致性。

四、摄入时间(Ingestion time)

       摄入时间是数据进入Flink的时间,数据进入的时候会打上系统时间戳。摄入时间从发生的时间上看,处于事件时间和处理时间之间,它的实现成本也处在事件时间和处理时间之间。摄入时间可以提供比处理时间更高的确定性,因为数据进入Flink后它的时间就确定好了,在后续的计算中,可以有效地应对由于多并发或数据在节点间shuffle带来的乱序问题。

       但是在实际应用中,事件时间和处理时间用得最多,且Flink SQL目前仅支持事件时间和处理时间。

更多推荐

Flink菜鸟教程(二)——时间概念