ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Feast HBase Online Store 在线特征存储实战:从配置接入到数据读写与底层实现

Feast HBase Online Store 在线特征存储实战:从配置接入到数据读写与底层实现 Feast HBase Online Store 在线特征存储实战从配置接入到数据读写与底层实现【免费下载链接】feastThe Open Source Feature Store for AI/ML项目地址: https://gitcode.com/GitHub_Trending/fe/feast本文围绕 Feast 官方 Python SDK 中的 HBase 在线特征存储模块feast.infra.online_stores.hbase_online_store展开完整讲解其配置项、接入流程、数据写入/读取原理、行键与列族设计以及集成测试方式。读者读完可以掌握如何在 feature repository 中声明 HBase 作为 online store并理解 Feast 与 HBase Thrift 之间的数据交互细节。模块定位为 Feast 补上 HBase 在线存储能力Feast 的核心架构将特征存储分为离线存储Offline Store与在线存储Online Store在线存储面向低延迟的线上特征查询feast materialize会把离线批量特征同步进去。feast.infra.online_stores.hbase_online_store正是其中的一个在线存储实现它通过 happybase 客户端连接 HBase Thrift Server实现特征的批量写入、在线读取、表创建与删除。需要说明的是HBase 并不在 Feast 官方核心路线图中该模块由社区扩展贡献。模块内的 README 明确写道HBase 不在当前 Feast roadmap 内该项目旨在为 Online Store 增加 HBase 支持每次materialize调用时会创建一张project_feature_view_name的表并持续更新数据。这一点从源码可以得到更精确的印证HbaseOnlineStore._table_id()实际返回的是f{project}:{table.name}格式的标识hbase.py即表名由项目名与 FeatureView 名通过冒号拼接而成README 中的下划线写法属于简化描述。该模块对应的 Sphinx API 文档入口为 feast.infra.online_stores.hbase_online_store.rst它通过automodule指令暴露两个子模块与包级内容feast.infra.online_stores.hbase_online_store.hbase核心实现包含HbaseOnlineStore与HbaseOnlineStoreConfigfeast.infra.online_stores.hbase_online_store.hbase_repo_configuration集成测试用的仓库配置包级feast.infra.online_stores.hbase_online_store模块汇总导出。配置详解在 feature_store.yaml 中声明 HBaseHbaseOnlineStoreConfighbase.py继承自FeastConfigBaseModel是feature_store.yaml中online_store:段落的类型定义。其字段如下配置字段类型默认值含义typeLiteral[hbase]hbase在线存储类型选择器固定为hbasehostStrictStr必填HBase Thrift 服务器的主机名portStrictStr必填HBase Thrift 服务监听端口connection_pool_sizeint4连接池中保留的到 Thrift 服务器的连接数protocolStrictStrhappybase 的DEFAULT_PROTOCOL与 Thrift 服务器通信使用的协议transportStrictStrhappybase 的DEFAULT_TRANSPORT与 Thrift 服务器通信使用的传输方式protocol与transport的默认值直接取自 happybase 的happybase.connection.DEFAULT_PROTOCOL和DEFAULT_TRANSPORT见 hbase.py即binary协议与framed传输这也是 HBase Thrift 默认的组合。connection_pool_size控制ConnectionPool的规模在并发读写场景下可以适当调大。一个可用的最小配置示例来自模块 READMEproject: feature_repo registry: data/registry.db provider: local online_store: type: hbase host: 127.0.0.1 # hbase thrift endpoint port: 9090 # hbase thrift api port其中provider: local表示使用本地模式离线存储为本地文件registry指向本地注册表。端口 9090 是 HBase Thrift Server 的默认端口。完整上手流程从初始化到在线读取模块 READMEREADME.md给出了完整的端到端流程共四步。第一步创建 feature repositoryfeast init feature_repo cd feature_repofeast init会生成一个包含feature_store.yaml、example.py特征定义等文件的模板仓库。第二步编辑 feature_store.yaml将online_store的类型改为hbase并填写 Thrift 地址与端口即上一节的 YAML 片段。第三步应用特征定义feast -c feature_repo apply预期输出Registered entity driver_id Registered feature view driver_hourly_stats_view Deploying infrastructure for driver_hourly_stats_viewfeast apply会注册实体与 FeatureView并触发在线存储的update()逻辑若对应 HBase 表不存在则创建若存在则保留详见下文“update 与 teardown 语义”。第四步增量物化最新数据到 HBase$ 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 hbase 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]materialize-incremental会以当前时间为截止时间把离线数据批量写入 HBase进度条通过online_write_batch的progress回调驱动。第五步按实体 ID 读取在线特征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内部会调用HbaseOnlineStore.online_read()按实体键批量回读 HBase 中的特征值并按请求顺序返回。数据模型与底层实现Feast 如何在 HBase 中组织数据列族与列命名HBase 中的列需要归属于某个列族。HbaseConstantshbase_utils.py统一了这些约定默认列族default事件时间戳列default:event_tsDEFAULT_EVENT_TS创建时间戳列default:created_tsDEFAULT_CREATED_TS每个特征列命名为default:feature_name通过get_col_from_feature()生成读取时用get_feature_from_col()反向从列名中剥离列族前缀还原特征名。因此一个 FeatureView 的每行数据在 HBase 中形如default:conv_rate、default:acc_rate、default:avg_daily_trips、default:event_ts、default:created_ts。行键设计entity_id FeatureView 后缀_hbase_row_key()hbase.py负责生成行键先用compute_entity_id()来自 helpers.py根据实体键与entity_key_serialization_version计算全局实体 ID再拼接#与 FeatureView 名称即f{entity_id}#{feature_view_name}。源码注释解释了这样设计的原因虽然entity_id本身能唯一定位实体但同一个 HBase 表会承载多个拥有相同实体集合的 FeatureView追加 FeatureView 名可以唯一标识某行属于哪个 FeatureView同时让同一实体的不同视图特征在 HBase 中就近存放colocated提升扫描与读取的局部性。写入路径online_write_batchonline_write_batch()hbase.py的处理流程通过_get_conn()取得或创建happybaseConnectionPool再包装为HBaseConnector计算表名f{project}:{table.name}用hbase.batch(table_name)开启批量写入happybase 的Batch延迟到send()统一提交对每条数据构造行键将每个特征值SerializeToString()序列化后写入default:feature列时间戳处理event_ts用struct.pack(L, calendar.timegm(...))编码为大端无符号 4 字节整数created_ts同理存在时调用b.send()提交最后回调progress(len(data))报告进度。特征值之所以先经ValueProto.SerializeToString()再落库是为了保留 Feast 类型系统的全部信息类型标记、列表/映射等复合结构读取时再反序列化回ValueProto。读取路径online_readonline_read()hbase.py为每个实体键计算行键调用hbase.rows(table_name, row_keys...)批量取行对每一行遍历各列特征列反序列化为ValueProto并仅保留requested_features中请求的特征event_ts列用struct.unpack(L, ...)解码后经datetime.fromtimestamp还原为 Python 时间若某实体键没有读到任何特征返回(None, None)无时间戳、无特征值与其余结果保持一一对应。update 与 teardown 语义update()hbase.py在feast apply时触发。对tables_to_keep中的每个 FeatureView若表不存在则create_table_with_default_cf()创建带default列族的表对tables_to_delete中的表执行删除。注释说明该实现不为实体维护任何特殊状态。teardown()hbase.py对传入的表逐一调用delete_table()。连接管理懒加载的 ConnectionPool_get_conn()hbase.py以类属性_conn缓存连接池首次调用时依据HbaseOnlineStoreConfig构造 happybaseConnectionPoolhost、port、sizeconnection_pool_size、protocol、transport后续读写复用同一连接池。HBaseConnectorhbase_utils.py在此基础上封装了建表、批量写入、单行/多行读取、扫描打印、删除表与关闭连接等操作删除表时使用conn.delete_table(table, disableTrue)先停用再删除。集成测试如何验证 HBase 在线存储仓库为 HBase 在线存储提供了两层测试支撑集成测试仓库配置hbase_repo_configuration.pyhbase_repo_configuration.py定义FULL_REPO_CONFIGS [IntegrationTestRepoConfig(online_store_creatorHbaseOnlineStoreCreator)]将 HBase 接入 Feast 的通用集成测试框架。容器化在线存储创建器HbaseOnlineStoreCreatortests/universal/feature_repos/universal/online_store/hbase.py使用 testcontainers 启动harisekhon/hbaseDocker 镜像并暴露 9090 端口等待日志中出现Initializing Hbase Local with the following configuration:后返回{type: hbase, host: 127.0.0.1, port: exposed_port}作为动态配置测试结束后停止容器。这意味着一套 CI 环境只需 Docker 即可完成对 HBase 在线存储的端到端验证无需预先搭建 HBase 集群。若在本地验证也可以参考hbase_utils.py末尾的main()示例hbase_utils.py通过ConnectionPool(hostlocalhost, port9090)直连 HBase用serialize_entity_key构造实体键并批量读取指定行观察列名与值——这是排查表数据是否正确写入的快捷手段。使用注意与适用边界模块定位是社区扩展HBase 在线存储不在 Feast 官方 roadmap 中属于贡献代码引入前应评估后续维护与升级兼容性。表名规范差异README 描述为project_name_feature_view_name而源码_table_id()实际使用{project}:{feature_view_name}冒号分隔排查表名时以源码为准。时间戳编码event_ts/created_ts使用大端无符号 4 字节整数存储 Unix 时间跨语言读取需按同一格式解码特征值则以 protobuf 二进制形式存储需用ValueProto.ParseFromString还原。数据一致性写入采用 happybaseBatch批量提交保证一次性写入多行/多列读取未命中时返回(None, None)占位调用方需自行处理空值场景。环境要求需要可访问的 HBase Thrift Server默认 9090 端口以及安装 happybase 依赖provider: local示例仅适用于本地开发生产部署应结合实际离线存储与 Provider 配置。通过上述配置、流程与源码级解读你已具备在 Feast 中接入 HBase 在线存储并深入排查其数据读写行为的能力。【免费下载链接】feastThe Open Source Feature Store for AI/ML项目地址: https://gitcode.com/GitHub_Trending/fe/feast创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表