ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Feast MySQL Online Store 接入指南:配置、物化与在线特征读取实战

2026/9/18 7:37:25 拓冰建站 浏览量
Feast MySQL Online Store 接入指南:配置、物化与在线特征读取实战 Feast MySQL Online Store 接入指南配置、物化与在线特征读取实战【免费下载链接】feastThe Open Source Feature Store for AI/ML项目地址: https://gitcode.com/GitHub_Trending/fe/feastMySQL 是当前 Feast 官方路线图中尚未正式规划的存储系统但社区通过在sdk/python/feast/infra/online_stores/mysql_online_store目录下的实现为其提供了完整的 Online Store 支持。本文基于仓库内 mysql_online_store/README.md 与 mysql.py 源码讲解如何在 Feature Repository 中把 MySQL 配置为在线特征存储、执行物化materialize并把最新特征实时读取出来。读完本文你将掌握 MySQL Online Store 的完整配置参数、端到端使用流程以及其底层表结构与读写实现的原理。MySQL Online Store 在 Feast 中的定位Feast 的 Online Store 抽象定义在 online_store.py它要求实现类提供online_write_batch批量写入、online_read按实体键读取、update基础设施调和和teardown清理资源等核心方法。MySQL 实现即遵循这套接口配置类MySQLOnlineStoreConfig负责解析feature_store.yaml中的online_store段存储类MySQLOnlineStore负责与 MySQL 建连、读写特征数据每次materialize物化调用时Feast 会把离线特征写入以project_name_feature_view_name命名的 MySQL 表供低延迟在线读取。从 repo_config.py 可以看到类型映射mysql被注册为feast.infra.online_stores.mysql_online_store.mysql.MySQLOnlineStore因此在feature_store.yaml中只需把online_store.type设为mysql即可被 Feast 自动加载。第一步创建 Feature Repository沿用 Feast 标准初始化流程在 shell 中执行feast init feature_repo cd feature_repo初始化后会生成一个包含feature_store.yaml与示例特征定义如example.py的最小仓库骨架本文后续的apply、materialize-incremental命令都基于该目录执行。第二步配置feature_store.yaml使用 MySQL编辑仓库根目录下的feature_store.yaml将online_store的类型设置为mysql完整配置如下project: feature_repo registry: data/registry.db provider: local online_store: type: mysql host: 127.0.0.1 # mysql endpoint, default to 127.0.0.1 port: 3306 # mysql port, default to 3306 user: test # mysql user, default to test password: test # mysql password, default to test database: feast # mysql database, default to feast batch_write: false # supporting batch write and commit per batch batch_size: 100 # batch size, default to 100各参数的含义与默认值与 mysql.py 中MySQLOnlineStoreConfig的字段定义一一对应参数类型默认值说明type字符串mysql固定字面量用于触发 Online Store 类型映射host字符串127.0.0.1MySQL 服务端点port整数3306MySQL 端口user字符串testMySQL 用户名password字符串testMySQL 密码database字符串feast目标数据库名表会被创建在该库中batch_write布尔false是否启用批量写入并按批提交batch_size整数None批量写入时的批大小这些默认值并非文档承诺而是源码中_get_conn的连接逻辑直接体现的host or 127.0.0.1、user or test、password or test、database or feast、port or 3306且autocommit由batch_write决定见 mysql.py。因此即使省略大部分字段Feast 也能按默认参数连接本地 MySQL。第三步应用特征定义在example.py中定义好 Entity 与 FeatureView 后执行feast -c feature_repo applyapply会注册实体与特征视图并在 MySQL 中创建对应的基础设施。参考输出Registered entity driver_id Registered feature view driver_hourly_stats_view Deploying infrastructure for driver_hourly_stats_viewDeploying infrastructure这一步实际触发了MySQLOnlineStore.update方法对每个需要保留的 FeatureView执行CREATE TABLE IF NOT EXISTS project_feature_view_name建表并检查information_schema.statistics若缺少以表名加_ek后缀命名的索引则通过ALTER TABLE ... ADD INDEX补建实体键索引见 mysql.py。MySQL 中的表结构由update方法可以确定每张在线特征表拥有如下结构CREATE TABLE IF NOT EXISTS project_feature_view_name ( entity_key VARCHAR(512), feature_name VARCHAR(256), value BLOB, event_ts timestamp NULL DEFAULT NULL, created_ts timestamp NULL DEFAULT NULL, PRIMARY KEY(entity_key, feature_name) );即同一行数据以“实体键 特征名”作为联合主键value列存放 protobuf 序列化后的特征值event_ts记录事件时间created_ts记录写入时间同时表名形如feature_repo_driver_hourly_stats_view符合文档所述“每次物化都会更新该表”的命名与更新约定。第四步物化最新数据到 MySQL离线特征通过物化命令写入 MySQL。先在 shell 中取当前时间再执行增量物化$ CURRENT_TIME$(date -u %Y-%m-%dT%H:%M:%S) $ feast -c feature_repo materialize-incremental $CURRENT_TIME参考输出Materializing 1 feature views from 2022-04-16 15:30:3905:30 to 2022-04-19 15:31:0405:30 into the mysql online store. driver_hourly_stats_view from 2022-04-16 15:30:3905:30 to 2022-04-19 15:31:0405:30: 100%|████████████████████████████████████████████████████████████████| 5/5 [00:0000:00, 120.59it/s]底层写入路径逐条提交与批量提交物化最终调用的是MySQLOnlineStore.online_write_batch见 mysql.py其行为由batch_write配置分支非批量模式默认逐条执行INSERT ... ON DUPLICATE KEY UPDATE每处理完一个实体键的所有特征后立即commit()适合数据量小、需要实时可见的场景批量模式batch_write: true先把特征值序列化结果累积到insert_values列表达到batch_size后调用cursor.executemany一次性写入并提交批量末尾的剩余数据也会在循环结束后补写提交任一批失败时执行rollback()并抛出异常。两种模式写入时都使用ON DUPLICATE KEY UPDATE语义见 mysql.py若主键(entity_key, feature_name)已存在则用新值覆盖value、event_ts、created_ts实现“最新物化结果覆盖旧数据”的效果这正对应 README 中“每次 materialize 调用更新表数据”的描述。需要留意的是从源码实现看批量模式读取的是config.online_store.bacth_size注意该拼写为源码中的实际写法且批大小小于 2 时会抛出ValueError(Batch size must be at least 2)配置时建议显式给出合理的batch_size。第五步在线读取最新特征物化完成后即可在应用侧使用 Python SDK 按实体键读取在线特征from pprint import pprint from feast import FeatureStore store FeatureStore(repo_path.) feature_vector store.get_online_features( features[ driver_hourly_stats:conv_rate, driver_hourly_stats:acc_rate, driver_hourly_stats:avg_daily_trips, ], entity_rows[ {driver_id: 1004}, {driver_id: 1005}, ], ).to_dict() pprint(feature_vector)参考输出{acc_rate: [0.01390857808291912, 0.4063614010810852], avg_daily_trips: [69, 706], conv_rate: [0.6624961495399475, 0.7595928311347961], driver_id: [1004, 1005]}读取路径的源码实现get_online_features经由OnlineStore.get_online_features编排后最终落到MySQLOnlineStore.online_read见 mysql.py对每个实体键先用serialize_entity_key序列化并转成十六进制字符串作为entity_key执行SELECT feature_name, value, event_ts FROM table WHERE entity_key %s取出该实体全部特征将value列中的二进制通过ValueProto.ParseFromString反序列化为特征值若查询无记录则返回(None, None)否则返回(event_ts, {feature_name: value})。整个流程是逐实体键串行查询依赖update阶段创建的表名索引table_ek来加速entity_key等值查找。另外从 online_store.py 的_is_versioned_read_supported可以看出MySQL Online Store 被显式列入支持版本化versioned在线读取的存储类型名单中可配合enable_online_feature_view_versioning与版本化表名形如_v1、_v2使用teardown时也会按^base_v[0-9]$正则清理全部版本表。依赖与测试验证MySQL Online Store 的 Python 连接层基于pymysqlmysql.py运行前需确保环境已安装该依赖。仓库内的通用测试配置 mysql_repo_configuration.py 注册了两套测试场景MySQLOnlineStoreCreator默认逐条提交模式BatchWriteMySQLOnlineStoreCreatorbatch_write: True、批大小 1000 的批量提交模式。两者对应的实现位于 tests/universal/feature_repos/universal/online_store/mysql.py通过testcontainers.mysql.MySqlContainer启动mysql:latest容器并暴露 3306 端口使用root/test用户与test数据库完成端到端验证。这意味着非批量与批量两条写入路径都被覆盖在 Feast 的通用在线存储测试集中是验证本配置可行性的直接参考。使用建议与注意事项建库先行MySQLOnlineStore只负责建表与索引不会创建数据库本身使用前需确保database: feast指定的库已存在且连接用户具备建表、索引和读写权限。选择写入模式小规模数据与实时验证可直接使用默认逐条提交模式数据量大、追求物化吞吐时开启batch_write: true并合理设置batch_size源码要求不小于 2建议按千级设置以减少提交开销。键值存储模型在线表按“实体键 特征名”组织同一 FeatureView 的多个特征对应同一实体键下的多行记录主键冲突时由ON DUPLICATE KEY UPDATE保证“后物化者覆盖先物化者”。生命周期管理feast teardown会调用MySQLOnlineStore.teardown删除对应 FeatureView 的表版本化开启时连同全部版本表一并清理不再使用的特征可据此安全释放 MySQL 存储空间。至此你已经可以基于这份社区实现把 MySQL 作为 Feast 的低延迟在线特征存储走通“定义特征 → apply → 物化 → 在线读取”的完整链路并为已有 MySQL 基础设施的团队省去额外引入 Redis、DynamoDB 等专用在线存储的成本。【免费下载链接】feastThe Open Source Feature Store for AI/ML项目地址: https://gitcode.com/GitHub_Trending/fe/feast创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考