以滑窗统计为例,具体讲解下生产逻辑:
根据时间轴按照指定的粒度切分不同的分片
收到新的数据上报,根据 eventTime 合并到对应分片
根据配置的窗口大小,取出对应分片合并计算特征结果,同时注册下一次触发的定时器(分片滑出窗口的时间)
定时器触发按照 triggerTime 扫描出在窗口大小内的分片数据,进行合并计算
窗口的滑入滑出均以分片为单位,因为分片为特征的最小精度
混合状态存储架构
在实时特征生产场景中,Flink 任务常常需要处理大规模状态数据。生产环境中可能会遇到两个主要问题:
当状态数据量达到 TB 级别时,在保证数据不丢失、不重复的语义下,一旦发生故障需要恢复,恢复速度会很慢,导致业务中断时间较长,通常超过 10 分钟
目前 Flink SQL 的状态恢复机制较为严苛,在很多场景下,作业变更无法从原先状态恢复,对于新增特征的需求,希望能够在状态上直接进行更新,实现无损重启。
为了解决这些问题,框架实现了状态的冷热数据分离,热数据在 FlinkState 内,冷数据 (包含热数据) 存储在外部存储 (Redis,HBase)。
在任务执行过程中,会优先从 FlinkState 中读取数据。如果 FlinkState 中没有找到所需的数据,则会从外部存储系统中加载。每次执行 checkpoint 操作时,会将状态的变更部分同步到外部存储中,以此确保数据的一致性。这样的设计既保证了数据的高可用性,也提高了系统的容错能力。
任务恢复时,不再将全量数据同步拉取、同步加载。而是同步加载热数据,运行时按需查询冷数据。热数据加载完毕后,整个任务即可开始运行。
若要在现有状态中添加新特征,可以采用旁路离线任务的方式,将新特征作为额外的一列写入外部存储。一旦数据同步完成,只需对现有的任务逻辑进行相应的修改,即可实现新特征的无缝集成。