流计算中的window机制|青训营笔记.

72 阅读2分钟

这是我参加第四届青训营笔记创作活动的第3天

  1. watermark
  • 在数据中插入一些watermark来表示当前真实时间
  • 在数据存在乱序的时候,watermark可以用来在乱序容忍和实时性之间做一个平衡
  • 如何产生watermark
  • CREATE TABLE orders{ user BIGINT; product STRING; order-time TIMETAMP(3); WATERMARK FOR order_time AS order_time-INTERVAL 5'SCECOND;// 减去5秒做为watermark的数值 }WITH(…)

2.通过 FLINK UI观察watermark

  • 问题一
    • watermark生成
      • per-subtask:一个source subtask消费多个partition则可能加剧乱序程度
      • per-partition:基于每个partition单独的watermark生成机制
  • 问题二
    • 部分partition/subtask断流:上流有一个subtask的watermark不更新则下游的watermark都不更新
    • 解决方案:Idle Source—当某个subtask断流超过配置的idle超时时间,将当前subtack置为idle,并下发一个idle的状态给下游。下游在计算自身watermark时,可以忽略掉当前是idle的那些subtask。
  • 问题三
    • 迟到数据处理
      • window聚合,默认丢弃
      • 双流JOIN,如果是outer join,则可以认为它不join任何数据
      • CEP,默认丢弃
  1. window分类
  • Tumble(流动窗口)
    • 每个key单独划分,每条数据只属于一个窗口
    • 触发:window结束时间到达的时候一次触发
  • sliding(滑动窗口)
    • 每个key单独划分,每条数据可能属于多个窗口
    • 触发:window结束时间到达的时候一次触发
  • session (会话窗口)
    • 每个key单独划分,每条数据单独划分一个窗口,如果window之间有交集则进行merge
    • 触发:window结束时间到达的时候一次触发
  • 其他
  1. 迟到数据处理
  • wmdow中的定义:划分出的window end小于当前watermark则认为迟到,只有事件时间下才会有迟到数据,默认丢弃
  • Allow lateness:窗口计算结束后多保留allowlateness(时间)的状态,适用于DataStream、SQL
  • SideOutPut:对迟到数据打一个tag,在Datastream上根据这个tag获取迟到数据流,在业务层面自行选择处理,适用于Datastream
  1. 增量VS全量计算
  • 增量:即到即算,window只存储结果(reduce, aggregate,SQL的聚合)
  • 全量:先存储到window的state中,等到window触发计算时将所有数据取出一起计算(典型的process函数)