ITPub博客

首页 > > > Flink学习篇2

Flink学习篇2

作者:兔子爱喝奶茶 时间:2020-07-01 18:30:40 0 删除 编辑

Flink的时间概念

Event Time:是事件创建的时间。它通常由事件中的时间戳描述,例如采集的日志数据中,每一条日志都会记录自己的生成时间,Flink通过时间戳分配器访问事件时间戳。

Ingestion Time:是数据进入Flink的时间。

Processing Time:是每一个执行基于时间操作的算子的本地系统时间,与机器相关,默认的时间属性就是Processing Time。

究竟哪个时间对我们才是意义要研究的呢。

例子

一条日志进入Flink的时间为2020-05-01 10:00:00.123,到达Window的系统时间为2020-05-01 10:00:01.234,日志的内容如下:

2020-05-01 18:37:15.624 INFO Fail over to rm2

对于业务来说,要统计1min内的故障日志个数,哪个时间是最有意义的?

—— eventTime,因为我们要根据日志的生成时间进行统计。

窗口概念

滚动窗口

特点:时间对齐,窗口长度固定,没有重叠。

适用场景:适合做BI统计等(做每个时间段的聚合计算)

scala代码 求15s的滚动窗口

val minTempPerWindow = dataStream
  .map(r => (r.id, r.temperature))
  .keyBy(_._1)
  .timeWindow(Time.seconds(15))
  .reduce((r1, r2) => (r1._1, r1._2.min(r2._2)))

scala代码 求个数为5的滚动窗口

val minTempPerWindow: DataStream[(String, Double)] = dataStream
.map(r => (r.id, r.temperature))
.keyBy(_._1)
.countWindow(5)
.reduce((r1, r2) => (r1._1, r1._2.max(r2._2)))

滑动窗口

特点:时间对齐,窗口长度固定,有重叠。

适用场景:对最近一个时间段内的统计,比如股票系统开盘后要实时查看最近1小时的交易数据,就需要设计window size=1hour,window slide=1min,这样系统就会每分钟刷新最近的交易数据,这种应用场景只能通过滑动窗口来实现。

scala代码 求窗口大小为15s,滑动距离为5s的窗口

val minTempPerWindow: DataStream[(String, Double)] = dataStream
  .map(r => (r.id, r.temperature))
  .keyBy(_._1)
  .timeWindow(Time.seconds(15), Time.seconds(5))
  .reduce((r1, r2) => (r1._1, r1._2.min(r2._2)))

scala代码 求窗口个数为5,步长为1的滑动窗口

val minTempPerWindow: DataStream[(String, Double)] = dataStream
.map(r => (r.id, r.temperature))
.keyBy(_._1)
.countWindow(5)
.reduce((r1, r2) => (r1._1, r1._2.max(r2._2)))

会话窗口

特点:时间无对齐。失效时间的设置,gap大于一定的值就关闭窗口,如window3差点关闭

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69918097/viewspace-3164578/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-04-26

  • 博文量
    1470
  • 访问量
    11193