回填是指重新生成历史特征值,这通常是由于引入新的特征定义、修复现有特征转换逻辑中的错误,或者需要填充比最初计划更早的特征值所引发的。尽管看起来简单,但在特征存储中回填历史数据通常是一项复杂、资源密集且可能造成中断的操作。它直接影响数据一致性与质量,因此制定相关策略非常重要。
为何需要回填?
几种情况需要回填:
- 引入新特征: 当创建新的特征组或特征定义时,通常需要其历史值来使用过去的数据训练模型或进行历史分析。如果没有回填,该特征将只具有从创建时间点开始的值。
- 转换逻辑中的错误修复: 如果在生成特征的代码中发现错误,仅仅部署修复程序只会影响未来的值。为了纠正过去训练运行或分析中使用的历史不准确之处,需要使用已纠正的逻辑进行回填。
- 模式或逻辑修改: 对特征定义或底层转换逻辑的调整(例如,更改聚合窗口、加入新的数据源)可能需要重新生成历史值,以在新定义下保持一致性。
- 扩展历史深度: 最初的要求可能只需过去一年的特征,但后来的分析或模型重新训练工作可能需要将历史数据追溯更远,这就需要进行回填。
- 数据损坏恢复: 在特征存储中数据损坏或丢失的罕见情况下,从源数据回填可能是恢复过程的一部分。
主要回填策略
选择合适的回填策略取决于数据规模、紧急程度、可用资源以及回填的具体原因。
完全重新计算
这是最直接的方法:使用更新后的逻辑或新定义,为所需历史时段重新运行整个特征生成管道。
- 优点: 简单;确保在回填时段内,基于单一更新的逻辑,数据保持完全一致。
- 缺点: 对于大型数据集或长历史时段,计算成本极高且耗时。可能对源系统和离线特征存储造成巨大负载。可能需要专用计算集群和仔细的调度。历史数据可用前可能面临长时间的延迟。
增量回填
这种方法不是一次性处理全部历史数据,而是将回填时段分成更小、更易于管理的块(例如,按天、按周或按月批处理)。然后按顺序或并行处理每个块。
- 优点: 与完全重新计算相比,资源消耗更易于管理。允许暂停和恢复。错误通常局限于较小的块。如果资源允许且依赖关系得到管理,可以并行运行以加快处理速度。
- 缺点: 需要更复杂的编排和状态管理来跟踪已处理的块。确保幂等性(多次运行同一个数据块能产生相同结果)极其重要。如果在较长的回填持续时间里,不同数据块使用略有不同的逻辑版本或依赖关系进行处理,可能出现不一致。
一幅图示,展示了由协调器管理的增量回填过程,该过程分块处理历史源数据并写入离线存储。
选择性回填
仅针对受更改或错误修复影响的特定特征、特征组或实体ID进行回填。
- 优点: 与完全回填或广泛的增量回填相比,显著降低计算负载。目标修复完成时间更快。
- 缺点: 需要精确识别受影响的范围。如果相关特征未同时回填,可能会引入临时不一致。在选择性回填期间管理特征之间的依赖关系可能很复杂。
影子回填(或双重计算)
计算新的或已修正的特征值,并将其写入独立位置(例如,新的表分区、不同的特征版本),而无需立即替换现有的生产值。回填完成并验证后,将下游使用者(训练管道、在线存储摄取)切换到使用新版本。
- 优点: 在回填过程中最大限度地减少对生产系统的中断。允许在切换前进行彻底验证。如果在切换后发现问题,可提供回滚路径。
- 缺点: 需要额外的存储容量。增加了部署和切换过程的复杂性。可能延长修正/新特征被实际使用的时间。
回填中的重大难题
可靠地执行回填会带来若干操作和技术障碍:
- 计算成本与耗时: 处理可能达TB或PB级的历史数据需要大量的计算资源(例如,大型Spark集群),可能耗时数天甚至数周,影响预算和时间表。
- 源数据可用性与完整性: 历史源数据可能已被归档、删除或以与当前数据不同的格式存储。其质量可能随时间变化,包含缺失值、模式更改或原始管道未处理的损坏,从而导致回填期间出现错误。
- 保持时间点正确性: 这是一个重要的难题,尤其是在回填依赖于其他特征或时间敏感计算的特征时。回填逻辑必须严格仅使用在处理的历史时间戳 处 可用的数据,避免未来信息泄露。这通常需要仔细处理事件时间戳,并可能需要重建中间状态。有关详细机制,请参考“训练数据的时间点正确性”部分。
- 处理模式演变: 源数据模式、参考数据,甚至实体定义都可能在回填的历史时段内发生变化。回填逻辑必须足够完善,以处理这些历史变化,可能需要条件逻辑或多个版本的转换代码。
- 确保幂等性: 回填作业通常会在中途失败并需要重新启动。处理逻辑必须是幂等的,这意味着在相同的输入数据块上多次运行会产生特征存储中完全相同的输出状态,从而防止重复或不正确的聚合。覆盖策略或仔细的事务管理是必需的。
- 对生产系统的影响: 长期运行、资源密集的回填作业可能与常规、持续的特征计算管道竞争计算资源。将大量回填数据写入离线存储,并随后可能摄取到在线存储,如果不仔细管理(例如,限制写入速度),可能会使存储系统紧张并影响性能。
- 监控与验证: 跟踪多日回填作业的进度、及时检测故障以及验证回填数据的正确性并非易事。全面的日志记录、进度监控仪表板以及对输出的自动化数据质量检查非常重要。
- 依赖关系管理: 如果特征B依赖于特征A,那么回填特征A需要仔细考虑特征B。特征B是否也应该使用新回填的A值进行回填?这需要在回填过程中理解和管理特征依赖关系图。
成功应对这些难题需要仔细规划、工程实践、专用工具或编排框架,以及在回填操作之前、期间和之后的彻底验证。回填不应被视为事后诸葛,而应是成熟特征存储系统的核心操作能力。