Flink的实时计算

Posted Nathon的学习笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flink的实时计算相关的知识,希望对你有一定的参考价值。

flink可以广泛用于实时计算,特别是无限流的场景,比如在双11这天,淘宝或者天猫这天网页在某个时间段被用户浏览了多少次,那些热门商品是用户喜欢的。比如说,每隔5分钟,想看看最近一小时内被点击最多的商品。这就是一个很典型的flink-window的运用。

在flink里面,总体来看分为3种window:

  1. 滚动窗口:

    滚动窗口的特点是有固定大小,不会出现重叠。例如,指定了一个5分钟大小的滚动窗口,无限流的数据会根据时间划分成[0:00 - 0:05), [0:05, 0:10), [0:10, 0:15),… 等窗口;

  2. 滑动窗口:

    滑动窗口的特点是窗口可以重叠,滑动窗口有两个参数:size 和slide。size为窗口的大小,slide为每次滑动的步长。如果slide < size,则窗口会重叠,每个元素会被分配到多个窗口。如果 slide = size,则等同于滚动窗口。如果 slide > size,则为跳跃窗口,窗口之间不重叠且有间隙。

  3. 会话窗口:

    通过会话的活动来对元素进行分组。会话窗口与滚动窗口和滑动窗口相比,没有窗口重叠,没有固定窗口大小。相反,当它在一个固定的时间周期内不再收到元素,即会话断开时,这个窗口就会关闭。

根据上面几种窗口的特点,选择滚动窗口可以实现想要的结果。具体,可以再拆解下方法:

   1.抽取出业务时间戳,告诉 Flink 是基于业务时间做窗口

  • 过滤出点击行为数据;

    2.按一小时的窗口大小,每5分钟统计一次,做滑动窗口聚合;

    3.按每个窗口聚合,输出每个窗口中点击量排名靠前的商品.

数据方面,构造了很多页面数据,包含用户ID,商品ID,商品类型ID,用户行为类型和行为发生的时间。

接下来,构建Maven工程,来得到结果:

有几个概念需要做区分,比如我要的是“过去一个小时”,这个一小时是指的事件业务产生的时间(Event time),在flink里面有processing time(事件被处理的时间)和event time可以自己指定。默认情况下,flink采取的是processing time,而这里通过

env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);

改为event time.

另外,water mark也是值得注意的地方,他标记了当前处理到什么时间的数据了,用来追踪业务事件。这也是flink里面先进的地方,可以保证处理的消息是有序的。因为,所有消息到来的时间,和它真正发生在源头,在线系统 Log 当中的时间有可能是不一致的。简单来说,流处理从事件产生,到流经source,再到operator,中间是有一个过程和时间的。虽然大部分情况下,流到operator的数据都是按照事件产生的时间顺序来的,但是也不排除由于网络等原因,导致乱序的产生(out-of-order或者说late element)。

但是对于late element,又不能无限期的等下去,必须要有个机制来保证一个特定的时间后,必须触发window去进行计算了。这个特别的机制,就是watermark。

通过上面对时间的处理,就得到了一个带有时间标记的数据流了,后面就能做一些窗口的操作。

这里在本地,通过构造的数据,可以看到每5分钟一个窗口的点击量。


以上是关于Flink的实时计算的主要内容,如果未能解决你的问题,请参考以下文章

Flink+kafka实现Wordcount实时计算

Java开发之实时计算--Flink

Flink实时统计入MySQL

基于Flink的实时计算平台的构建

Fllink实时计算运用Flink Table API & SQL 案例实战

如何迁移开源 Flink 任务到实时计算Flink版?实战手册来帮忙!