基础知识
- 物理执行图(在各个TaskManager上部署Task后生成的图,并不是一个数据结构)
- 并行度相同的one-to-one任务可以合并成一个大任务(减少数据传输)
- disablechaining():强制不合并,前后都断开(针对任务资源消耗大的)
- startnewChain():从当前任务断开不合并
- slotshareingGroup():同一个共享组任务可以共享slot,不同的共享组不能共享slot
- 默认共享组是default
- eventtime:时间创建时间
- ingestion time:数据进入时间
- process time:处理时间
- watermark:系统允许的最大延迟时间 (延时触发,在curtime触发curtime-T时间的窗口)
- watermark传递:广播(给下游所有slot传递当前值)(不同上游分区不同值,以最小的值作为自己的时钟值)
flink 状态:
- 算子状态,限定为算子任务
- 列表状态(所有状态保存为一维数组)
- 联合列表状态(数据的列表,方便故障恢复)
- 广播状态(多项任务任务状态相同)
- 键控状态,根据输入流中定义的键来维护和访问 值状态 列表状态 key-value 映射状态 聚合状态
- 后端状态,
- memoryStateBackend 存储内存上
- FsStateBackend 本地存内存 备份在远程文件系统上,更好的容错性
- RocksDBStateBackend 所有状态系列化 存在本地DB中 无内存限制
flink容错机制
- 一致性检查点(checkpoint)
- 自动存盘 当某个时间点所有任务处理完相同的一个输入数据
- 使用新加barrier方法 广播给所有节点,确认节点 barrier之前的数据全部处理完成,当前节点才会继续处理之后数据
- 所有流程处理完成之后 jobManger存储完整流程的快照
- savepoint 手动存盘 原理和checkpoint一致 最好指定uid
状态一致性
- 最多一次
- 至少一次
- 精确一次
end to end一致性:
- 内部保证:checkpoint
- source ;可重复数据的读取位置
- sink:保证数据不会重复写入 幂等写入 事务写入
- 幂等写入:指数求导等于原值 类似与hash 存储,每个操作为key
- 事务写入:原子性 不同的checkpoint 设计为一个事务
- 预写日志:先做缓存到checkpoint 等到之后一次写入 (实时性不够) Datastream API 提供模板类:GenericWriteAheadSink
- 两阶段提交:每个checkpoint启动一个事务,当收到checkpoint完成时,正式提交,实现结果的真正写入,提供TwoPhaseCommitSinkFunction接口(外部系统必须提供事务支持)