流式处理Flink
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的意义: 并行流处理的时候, 知道每个流的进度并对齐到最慢的流
窗口划分:
- 按照自然时间, 优点简单, 缺点是在高负载下, 每个时间窗的事件容易过多
- 按照计数, 优点是负载均匀, 缺点是事件稀疏的时候后面的事件可能等前面的等很久