Ray学习随笔(3)ray-streaming-state源码阅读
前言
Ray 源码分析系列笔记。
一、概述
Ray学习随笔(1)启动过程源码阅读对 ray 本身的启动流程进程了分析,Ray学习随笔(2)ray-streaming源码阅读对 ray-streaming 的启动过程进行了分析.由于 ray-streaming-state 并没有被实际使用,所以前文并没有进行深入阅读.本篇具体阅读学习相关代码和业务逻辑.二、Java 源码分析
2.1 目录结构和文件功能
整个 state 源码包的目录结构如下所示.
1 | state |
2.2 重点参数研究
keyGroupIndex 数据存储相关,目前无用
- AbstractKeyStateBackend 的 getKeyGroupIndex 在 StateStoreManagerProxy 被调用,修改 stateStrategy 对应值,用在 get 和 put 前,但是后续实现中没有操作该对象.
- AbstractKeyStateBackend 的 setKeyGroupIndex 在 StateHelper 中被调用,调用父方法 setKeyGroupIndex 和 resetKeyGroupIndex 未被调用.
- KeyStateBackend 的 setCurrentKey 方法会根据 key 信息直接修改该值.
- AbstractStateBackend 的 setKeyGroupIndex 目前无调用
- AbstractStateStoreManager 的 setKeyGroupIndex 在 StateStoreManagerProxy 被调用,父方法 get 和 put 后续实现中没有操作该对象.父方法 setKeyGroupIndex 未被调用
currentCheckpointId 检查点相关
- AbstractKeyStateBackend 的 setCheckpointId 在 runtime/worker/context/StreamingRuntimeContext.java 中被调用,调用父类的 setCheckpointId 未被调用,状态检查点目前应该没有实现
- AbstractKeyStateBackend 的 setCheckpointId 在同文件 setContext 方法中被调用,调用父类的 setContext 未被调用
- AbstractKeyStateBackend 的 getCheckpointId 在 StateStoreManagerProxy 被调用,用在 put 和 get 操作中,put 直接根据检查点构建存储记录 StorageRecord,get 在 daul,mv 中有不同实现.
currentKey 数据查询相关
- AbstractKeyStateBackend 的 getCurrentKey 在 StateHelper 中被 getStateKey 调用,将 descName 和 currentKey 组合,构建存储键值,descName 通过 descriptor.getIdentify(),具体值为 descriptor 的 name 变量.
- AbstractKeyStateBackend 的 setCurrentKey 在 runtime/worker/context/StreamingRuntimeContext.java 中被调用,父函数 setCurrentKey 未见调用
- AbstractKeyStateBackend 的 setCurrentKey 在同文件 setContext 方法中被调用,调用父类的 setContext 未被调用
- AbstractKeyStateBackend 的 setCurrentKey 在 StateHelper 中被调用,调用方法 setCurrentKey 在 stateimpl 中被调用,后续应为用户调用
- AbstractKeyStateBackend 的 setCurrentKey 在 KeyStateBackend 中被实现,在赋值前会修改 KeyGroupIndex(KeyGroupAssignment.assignKeyGroupIndexForKey(currentKey, numberOfKeyGroups))策略为直接 hash 取模
- AbstractKeyStateBackend 的 setCurrentKey 在 OperatorStateBackend 中被实现,直接赋值
currentKey 切换会造成同样查询结果不同,currentKey 参与 StateKey 构建.descriptor 的 name 同样参与构建.
currentKey 应该与操作符或 task 绑定,descriptor 的 name 可以参与用户 state 绑定或 window 绑定,不同 window 不同 descriptor.
numberOfKeyGroups
- KeyStateBackend 的 numberOfKeyGroups 在构建时被赋值,目前只在 test 中进行构建.
- KeyStateBackend 的 numberOfKeyGroups 在 setCurrentKey 时被调用,根据调用情况来看,该变量应该为当前操作符并行度.
- KeyStateBackend 的 getNumberOfKeyGroups 未见调用
keyGroup
- KeyStateBackend 的 keyGroup 在构建时被赋值,目前只在 test 中进行构建.
- KeyStateBackend 的 getkeyGroup 未见调用
2.3 调用逻辑
整个 state 对外暴露的后端接口为 OperatorStateBackend
和 KeyStateBackend
,其中后者源码注释中表示应该只用于键值类型数据流,但是目前计算系统中未进行明细判断.后端的创建由 StateBackendBuilder
提供.在状态后端创建完成以后,两种后端对外暴露的存储类型不尽相同.当执行 commit 事务时,会将存储信息持久化.获取具体的装填后端存储时,需要传入 Descriptor 进行辅助.
1 | /** |
三、总结
- state 已经提供了完整的状态支持,ray-streaming 后续发展中应该会将 runtime 中的 content 整体替换成 state 中的 backend.
- state 目前仅支持内存作为状态存储后端,处于实验性阶段.后续如果对代码进行实际使用,应该提供其他可用后端.
参考
本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 我的个人天地!