这是我参与「第四届青训营 」笔记创作活动的的第2天
简介
- 这节课程从数据流和动态表的含义出发引出Exactly-Once和Checkpoint机制保证故障发生时,保证对数据消费的不丢不重。接着介绍Checkpoint机制如何和外部存储结合,实现端到端的数据保证。最后介绍了字节内部案例场景,使用Flink如何解决和实现账单计费服务。
数据流和动态表
- 为了保证数据的实时性(实时采集,实时处理)就需要有实时的数据流用来采集和传输数据流。
- 在数据流上定义表:用来格式化数据,当数据流中的数据增加时,结果表也将随之增长。
- 动态表:上面在数据流上定义的表就是动态表,与批处理数据的静态表不同,动态表是随时间变化的。可以像查询静态批处理表一样查询它们。数据库表是INSERT、UPDATE和DELETE DML语句的stream的结果,通常称为changelog stream。
- 对于数据查询:不断更新,不会终止。
- 在任何时候,连续查询的结果在语义上与以批处理模式在输入表快照上执行的相同查询的结果相同。
- 状态:存储实时的累计计数值
- Eg:需要存储每个用户的URL计数,以便能够增加该计数并在输入表接收新行时发送新结果。
Exactly-once和Checkpoint机制
- Exactly-once:最严格的处理语义,从输出结果来看,每条数据均被消费且仅消费一次,即使发生故障也仿佛故障从未发生。
- Checkpoint机制:保存某一时刻的系统状态应对突发故障时需要及时恢复。
- 状态恢复的时间点:需要等待所有处理逻辑消费完成source保留状态及之前的数据。
- 一个简单的快照制作算法:
- 暂停处理输入的数据;
- 等待后续所有处理算子消费当前已经输入的数据:
- 待2处理完后,作业所有算子复制自己的状态并保存到远端可靠存储;
- 恢复对输入数据的处理
Flink端到端的Exactly- once语义
- Checkpoint 能保证每条数据都对各个有状态的算子更新-次,sink 输出算子仍然可能下发重复的数据: 2.严格意义的端到端的Exactly-once语义需要特殊的sink算子实现。
案例:账单计算服务
-
kafka作为source读取出账单信息(固定大小的数据),处理(去重聚合)后,写入Mysql中(记录状态)。