Venice
面向行星级工作负载的衍生数据平台
Venice是一个衍生数据存储平台,具有以下特点:
- 从批处理和流式源(如Hadoop和Samza)进行高吞吐量的异步摄取。
- 通过远程查询或进程内缓存实现低延迟在线读取。
- 基于CRDT冲突解决的区域间主动-主动复制。
- 每个区域内支持多集群,由操作员驱动集群分配。
- 每个集群内的多租户、水平可扩展性和弹性。
上述特性使Venice特别适合作为特征存储(如Feathr)的有状态组件。AI应用程序将其ML训练作业的输出馈送到Venice,然后在在线推理工作负载期间查询数据以供使用。
概述
Venice是一个跨越离线、近线和在线世界的系统,如下图所示。
写入路径
Venice的写入路径可以分为三个粒度:完整数据集交换、向现有数据集插入多行以及更新某些行的某些列。Hadoop和Samza都支持这三种粒度。此外,任何服务也可以使用在线生产者库异步生成单行插入和更新。下表总结了每个平台支持的写入操作:
混合存储
此外,这三种粒度的写入操作可以在单个数据集中混合使用。除了行插入或行更新外,还进行完整数据集交换的数据集被称为"混合"数据集。
在将存储配置为"混合"时,一个重要概念是"回溯时间",它定义了应该将最近的实时写入回溯多远并应用于新交换的数据集版本之上。
利用这种机制,可以将流处理作业的输出叠加在批处理作业的输出之上。如果使用部分更新,则可以实时更新某些列,而批量更新其他列,这两组列可以根据需要重叠或不重叠。
写入计算
写入计算包括两种操作,可以对给定键关联的值执行:
- 部分更新:设置值中字段的内容。
- 集合合并:在集合或映射中添加或删除条目。
注意:目前,写入计算仅支持主动-被动复制。对主动-主动复制的支持正在开发中。
读取路径
Venice支持以下读取API:
- 单次获取:获取与单个键关联的值
- 批量获取:获取与一组键关联的值
- 读取计算:对与一组键关联的值的字段进行投影和/或计算某些函数。使用读取计算DSL时,目前支持以下函数:
- 点积:对存储在给定字段中的浮点向量与作为查询参数提供的另一个浮点向量执行点积,并返回结果标量。
- 余弦相似度:对存储在给定字段中的浮点向量与作为查询参数提供的另一个浮点向量执行余弦相似度,并返回结果标量。
- 哈达马德积:对存储在给定字段中的浮点向量与作为查询参数提供的另一个浮点向量执行哈达马德积,并返回结果向量。
- 集合计数:返回存储在给定字段中的集合的项目数。
客户端模式
访问Venice数据有两种主要模式:
- 经典Venice(无状态):您可以对Venice的分布式后端服务执行远程查询。如果在此模式下使用读取计算操作,查询将被推送到后端,只有计算结果会返回给客户端。有两种客户端能够执行此类远程查询:
- 轻量级客户端:这是最简单的客户端,它向路由层发送请求,路由层再向服务器层发送请求。
- 快速客户端:此客户端了解分区情况,因此可以直接向正确的服务器实例发送请求,跳过路由层。请注意,此客户端仍在开发中,可能不如轻量级客户端稳定或功能齐全。
- Da Vinci(有状态):或者,您可以预先加载数据集的部分或全部分区,并对生成的本地缓存执行查询。数据的未来更新将继续流入并应用于本地缓存。
下表总结了客户端的特性:
网络跳数 | 典型延迟(p99) | 状态占用 | |
---|---|---|---|
轻量级客户端 | 2 | < 10毫秒 | 无状态 |
快速客户端 | 1 | < 2毫秒 | 最小(仅路由元数据) |
Da Vinci客户端(RAM + SSD) | 0 | < 1毫秒 | 有限RAM,SSD上完整数据集 |
Da Vinci客户端(全内存) | 0 | < 10微秒 | RAM中完整数据集 |
所有这些客户端共享上述相同的读取API。这使用户能够在不需要重写应用程序的情况下更改其成本/性能权衡。
资源
开源Venice的博客和会议演讲是了解Venice可以支持哪些用例和规模的良好起点。有关更多Venice帖子、演讲和播客,请参阅我们的了解更多页面。
入门
请参阅Venice快速入门来创建您自己的Venice集群,并尝试一些功能,如创建数据存储、批量推送、增量推送和单次获取。我们建议使用我们最新的稳定版本。
社区
欢迎使用以下方式与社区互动:
关注我们以了解更多关于Venice项目和社区的进展: