Skip to main content

流式处理Flink

flink

流式数据处理的事实框架

流处理:在小时间窗内进行批处理

flink支持有状态计算

time-related feat

高层: SQL/Table API

流: DataStream API

底层: Event ProcessFunction

状态怎么保存: 内存/硬盘

先保存到内存,后续再增量式地异步snapshot到硬盘

工作分配:hash送到不同实例上

data stream上checkpoint barrier

中间崩溃可以replay到barrier(和db那种有点不一样, db是保证回放(redo log), 然后checkpoint加速回放; 这个因为写入频繁不保证回放, 日志也只记录到barrier过)

每次接受checkpoint barrier的时候, 会管控各个流的行为, 等待处理的进度对齐之后统一保存(已经完成的等待其他流到barrier)

这个barrier也可以是不对齐的, 但是保存的state会变多

处理事件的触发时间和处理时间的不同: 在stream之中加入watermark

watermark是带有时间刻度语义的事件, 这样可以区别流之中乱序的事件, 并忽略之

watermark的意义: 并行流处理的时候, 知道每个流的进度并对齐到最慢的流

窗口划分:

  • 按照自然时间, 优点简单, 缺点是在高负载下, 每个时间窗的事件容易过多
  • 按照计数, 优点是负载均匀, 缺点是事件稀疏的时候后面的事件可能等前面的等很久