ARTICLE DETAIL

资讯详情

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

为 Apache PredictionIO 贡献 SDK 的完整开发指南:Event Client 与 Engine Client 的 REST 实现规范

为 Apache PredictionIO 贡献 SDK 的完整开发指南:Event Client 与 Engine Client 的 REST 实现规范 为 Apache PredictionIO 贡献 SDK 的完整开发指南Event Client 与 Engine Client 的 REST 实现规范【免费下载链接】predictionioPredictionIO, a machine learning server for developers and ML engineers.项目地址: https://gitcode.com/gh_mirrors/pred/predictionio导读本文面向希望为 Apache PredictionIO 编写官方/第三方 SDK 的开发者围绕 docs/manual/source/community/contribute-sdk.html.md 给出的贡献指南系统讲解 SDK 必须实现的两大核心组件——Event Client向 Event Server 写入用户行为数据与Engine Client从 Engine 查询推荐/预测结果——的 REST 协议细节、JSON 数据契约与测试方法。读完本文你将掌握一个合格 SDK 的最小实现面核心请求的 URL/方法/状态码约定、7 个常用快捷操作的 JSON 模板、事件模型中$set/$unset/$delete等保留事件的语义以及如何用本地 Mock Server 在 CI 中自动化验证 SDK。文中所有协议细节均与当前仓库的 Event Server 与 Engine Server 源码实现相互印证。一、为什么需要 SDKEvent Client Engine Client 双组件模型Apache PredictionIO 是一个机器学习服务器其典型数据流是客户端应用把用户行为浏览、购买、评分等写入Event Server经过训练后从Engine Server查询推荐结果。因此一个 SDK 天然包含两个职责不同的 ClientEvent Client提供便捷方法让客户端应用轻松把用户行为记录到 Event ServerEngine Client向运行中的机器学习 Engine 发送查询Query并接收预测结果PredictedResult。SDK 的便捷方法本质上是 REST API 的封装所有协议都以 Event Client 提供的 REST API 为基础详细字段见仓库文档 docs/manual/source/datacollection/eventapi.html.md。这意味着即使没有现成 SDK你也可以直接使用curl验证每一个协议细节——本指南中的所有 JSON 示例均可原样通过 HTTP 发送。在开始编码前建议先通过pio app new AppName创建应用并记录生成的Access Key与App IDAccess Key 是所有 Event API 请求的鉴权凭证详见下文源码佐证。二、Event Client 实现规范Event Server 只有一个连接点因此 Event Client 的核心工作是先实现一个核心请求core request其余快捷方法只是组装参数并调用核心请求的语法糖。2.1 核心请求Core Request协议要素约定URLbase URL/events.json?accessKeyyour access key例如http://localhost:7070/events.json?accessKey1234567890方法POST请求体为 JSON 数据成功响应状态码201响应体为包含eventId的 JSON 对象失败响应状态码401access key 无效状态码400JSON 请求解析失败例如缺少event等必填字段或eventTime格式非法JSON 请求体的完整字段定义在 Event Creation API 中该页面给出了event、entityType、entityId、targetEntityType、targetEntityId、properties、eventTime各字段的类型、必填性与约束说明。核心字段摘要如下字段类型说明eventString事件名如sign-up、rate、view、buy以$或pio_开头的事件名为保留名如$set自定义事件名不得使用entityTypeString实体类型相当于关系数据库的表名entityType内entityId唯一entityIdString实体 IDentityType-entityId构成实体唯一标识targetEntityType/targetEntityIdString可选目标实体用于表示谁对谁做了什么propertiesJSON可选事件或实体的附加属性键名不得以$或pio_开头eventTimeString可选事件发生时间建议客户端必须生成ISO 8601 格式如2004-12-13T21:39:45.618Z服务端源码印证核心请求的路由定义在 data/src/main/scala/org/apache/predictionio/data/api/EventServer.scalapath(events.json)只接受post成功时以StatusCodes.Created201配合Map(eventId - id)返回而eventTime解析失败等序列化异常则由 400 语义处理。服务端支持从Query 参数accessKey或HTTPAuthorization: Basic ...头两种方式鉴权鉴权成功后才可获得appId并执行写入。2.2 服务端 Event 数据模型服务端收到的 JSON 会被反序列化为 data/src/main/scala/org/apache/predictionio/data/storage/Event.scala 中定义的Eventcase classcase class Event( val eventId: Option[String] None, val event: String, val entityType: String, val entityId: String, val targetEntityType: Option[String] None, val targetEntityId: Option[String] None, val properties: DataMap DataMap(), val eventTime: DateTime DateTime.now, val tags: Seq[String] Nil, val prId: Option[String] None, val creationTime: DateTime DateTime.now )可以看到除了文档中明示的字段外服务端还支持tags与prIdPredictedResultId反馈回路使用。另外在同一个文件中EventValidation.isReservedPrefix与specialEvents定义了保留事件集合val specialEvents Set($set, $unset, $delete)即 SDK 开发者需要了解以$或pio_开头的事件名/实体类型名/属性名均被保留$set、$unset、$delete三个特殊事件用于维护实体的属性状态见 2.4 节。2.3 7 个必须支持的快捷操作Event Client 应支持以下 7 个快捷操作shorthand operations它们分别覆盖用户实体、物品实体与通用行为记录。每个操作最终都构造一个 JSON 对象并调用 2.1 节的核心请求。用户实体User entities设置用户属性{ event: $set, entityType: user, entityId: user_ID, properties: properties }取消移除用户的部分属性{ event: $unset, entityType: user, entityId: user_ID, properties: properties }删除一个用户{ event: $delete, entityType: user, entityId: user_ID }物品实体Item entities设置物品属性{ event: $set, entityType: item, entityId: item_ID, properties: properties }取消移除物品的部分属性{ event: $unset, entityType: item, entityId: item_ID, properties: properties }删除一个物品{ event: $delete, entityType: item, entityId: item_ID }其他Others记录用户对某个物品的行为如rate、buy、view同时携带targetEntity与自定义属性{ event: event_name, entityType: user, entityId: user_ID, targetEntityType: item, targetEntityId: item_ID, properties: properties }关于$set、$unset、$delete等反转事件reversed events的完整语义解释请参阅 Event API 文档 与仓库中的 事件模型Events Modeling说明properties既可以描述一次普通事件的附加信息也可以配合$set/$unset/$delete记录实体属性的增量变化。实现提示7 个快捷操作不应各自实现一遍 HTTP 逻辑而应统一走核心请求。此外参考官方 SDK 的惯例如 python/pypio 与 docs/manual/source/datacollection/eventapi.html.md 中 PHP/Python/Ruby SDK 示例快捷方法通常提供create_event(event, entity_type, entity_id, target_entity_type..., target_entity_id..., properties..., event_time...)这类签名内部自动补齐entityType/entityId后调用核心请求。2.4 关于 eventTime 的重要约定eventTime字段是可选的但强烈建议客户端应用在请求中包含时间。因此Event Client 的最佳实践是如果请求中缺失时间字段在发送给服务端之前自动补上当前时间。这样做的原因在 Event Creation API 中有明确说明虽然服务端在未指定时会使用当前系统时间UTC但为了准确记录事件发生的真实时刻尤其是离线补传、网络延迟等场景时间应由客户端应用生成。从服务端源码看Eventcase class 的eventTime字段默认值为DateTime.nowSDK 端自动补时与此默认行为保持一致避免事件时间漂移。三、Engine Client 实现规范Engine Client 的核心职责是从运行中的 Engine 获取推荐/预测结果。相比 Event Client它的请求与响应格式规则更简单但完全由具体 Engine 的业务定义决定。3.1 查询协议要素约定URLbase URL/queries.json例如http://localhost:8000/queries.json方法POST请求体为 JSON 数据成功响应状态码200响应体为 JSON 结果对象失败响应状态码400例如无法解析查询请求示例来自推荐模板的查询{ user: 1, num: 4 }响应示例{ itemScores: [ { item: 39, score: 6.177719297832409 }, { item: 79, score: 5.931687319083594 }, ... ] }服务端源码印证Engine Server 的queries.json路由定义在 core/src/main/scala/org/apache/predictionio/workflow/CreateServer.scala。服务端接收 JSON 字符串后通过JsonExtractor.extract将其反序列化为 Engine 定义的Query类型依次执行Serving.supplementBase→ 各算法的predictBase→Serving.serveBase最终把PredictedResult序列化为 JSON 返回。3.2 请求与响应的 JSON 格式由 Engine 决定关键点Engine Client 请求与响应中的 JSON 对象格式必须由 Apache PredictionIO 的 Engine 定义且不同应用的 Engine 之间各不相同。上述示例取自Recommendation Engine 模板其查询与预测结果定义如下Scala case class见 examples/scala-parallel-recommendation 下各模板的Engine.scalacase class Query( user: String, num: Int ) extends Serializable case class PredictedResult( itemScores: Array[ItemScore] ) extends Serializable仓库中的实际模板略有扩展例如blacklist-items示例examples/scala-parallel-recommendation/blacklist-items/src/main/scala/Engine.scala在Query中增加了blackList: Set[String]字段ItemScore则携带item: String与score: Doublecase class Query( user: String, num: Int, blackList: Set[String] // ADDED ) case class PredictedResult( itemScores: Array[ItemScore] ) case class ItemScore( item: String, score: Double )对 SDK 开发者的启示由于 Query/PredictedResult 是每个 Engine 自定义的通用的 Engine Client 无法预知具体字段通常提供以下两种设计通用字典接口send_query(query: Map/Dict)接受任意 JSON 可序列化对象把业务字段完全交给应用层类型化接口为每个模板生成对应的类型化客户端直接暴露user、num、itemScores等强类型字段。无论哪种设计底层都只是向POST /queries.json发送 JSON 并解析 JSON 响应。若 Engine 开启了反馈回路feedback loop预测结果中可能带有prId等附加字段SDK 无需特殊处理将其作为普通 JSON 字段透传即可相关逻辑见 CreateServer.scala。四、测试你的 SDK4.1 本地环境联调最直接的验证方式是在本地搭建 Apache PredictionIO 环境用真实服务端做端到端测试启动事件存储默认使用 HBase见 安装文档等待初始化完成pio eventserver启动 Event Server默认绑定0.0.0.0:7070可用--ip 127.0.0.1收紧到本机pio app new AppName创建应用并记录 Access Key用 SDK 的 Event Client 写入事件检查返回 201 与eventId训练并部署一个模板 Engine 后用 Engine Client 发送查询并校验返回结构与预测分数。Event Server 的完整 REST 行为含状态检查GET /返回{status:alive}、批量写入POST /batch/events.json、事件查询过滤参数等可参考 Event API 文档。4.2 用轻量 Mock Server 做 CI 自动化测试在 Travis CI 等在线 CI 服务上搭建完整的 PredictionIO 环境成本高、难度大。此时建议使用轻量级 Mock Server仓库指南推荐的PredictionIO-Mock-Server项目来模拟 Event Server 与 Engine Server 的 HTTP 行为。它可以在几分钟内启动让 SDK 的单元测试/集成测试不依赖真实后端为 Event Client 测试模拟POST /events.json?accessKey...的 201/401/400 响应为 Engine Client 测试模拟POST /queries.json的 200/400 响应与固定 JSON 返回体从而在 CI 中自动验证 SDK 的 URL 拼接、JSON 序列化、状态码处理与错误分支。测试要点清单结合前文协议逐项核对核心请求 URL 是否包含accessKey查询参数成功写入后是否正确解析eventId401无效 key、400JSON 非法 / 缺event/eventTime格式错误是否被正确映射为 SDK 异常或错误返回7 个快捷操作生成的 JSON 是否与 2.3 节模板一致尤其entityType/targetEntityType的取值缺失eventTime时 SDK 是否自动补时Engine Client 的查询与响应解析是否与目标 Engine 的Query/PredictedResult结构匹配。五、总结一个合格 SDK 的验收标准回顾全文一个合格的 PredictionIO SDK 至少应满足Event Client 实现核心请求POST base/events.json?accessKey...正确处理 201/401/400覆盖 7 个快捷操作用户与物品的$set/$unset/$delete以及带targetEntity的行为记录自动补全 eventTime缺省时由客户端生成时间字段Engine Client 支持任意 Engine 的 Query/PredictedResult以通用 JSON 或类型化接口对接POST base/queries.json可测试既能本地联调也能通过 Mock Server 在 CI 中自动验证。如果你正在为 Apache PredictionIO 编写新的语言 SDK以上协议就是完整的实现蓝图——服务端行为均可通过仓库源码EventServer.scala、CreateServer.scala、Event.scala逐一验证。我们期待看到你的 SDK 贡献【免费下载链接】predictionioPredictionIO, a machine learning server for developers and ML engineers.项目地址: https://gitcode.com/gh_mirrors/pred/predictionio创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表