VLDB'23-(分布式时序索引)ODYSSEY: A JOUR

2023-02-02  本文已影响0人  Caucher

标题:奥德赛:在分布式时序相似性检索的大陆上的一场旅行
【奥德赛一周目毕业玩家飘过:)】

编者的总结

  1. 本文针对的是现代分布式集群上的【内存型】时序索引,查询模式是精确knn查询,主要度量指标就是平均时延。
  2. 整体的架构设计是比较完整的,应该是第一个真正意义上的内核索引。
  3. 核心算法还是iSAX索引,本文给出了一个水平分片+垂直冗余的架构设计,满足查询时负载均衡的数据放置策略,基于简单的代价估计做动态查询负载均衡,设计了任务偷取加强负载均衡。一套组合拳,但技术上难度均不大。

编者的思考

  1. 因为之前的分布式时序索引TARDIS不支持精确knn查询,所以本文可以说是补了这个空。MESSI主要的点在并行方面,没有做到完全的分布式。本文虽然没提近似搜索的内容,但应该也能扩展。
  2. 之前时序索引的核心思路是把相近的序列放到一起,但本文的想法是把相似的序列分散着放来保证查询时的负载均衡。我觉得前者可能对吞吐量友好,毕竟总的代价是比较低的,后者也就是本文,对平均时延会更友好一些。这里也许还值得再探索一下。
  3. 由于本文是C+MPI来编写的,又不涉及采样等操作,所以理论上应该能支持动态数据集,这相比于TARDIS又减少了一个限制。
  4. 基于磁盘的能支持精确knn的时序索引还是一个坑,如果能拓展到云环境下则会更好。

1 Introduction

3 The Odyssey Framework

Odyssey的整体框架分5步:

  1. 第一步首先数据分区,分成节点个数那么多的区,然后塞给每个节点一个分区;
  2. 第二步在节点内构建本地索引;然后构建复制组,复制组内的节点都是同样的数据;组内有一个协调者,负责查询调度;
  3. 第三阶段是代价估计,代价高的先执行,动态地将查询下发给组协调者;
  4. 第四阶段是节点来做具体查询,在此阶段作者也提出了一些新的并行技术;
  5. 第五阶段是局部结果的汇总。
image.png

3.1 Query Scheduling

给定一组query,要想得到精确结果,必须首先选择一组覆盖全部数据集的节点,称为cluster(cluster内各节点的数据不重合)。让哪一组去执行哪一些query,就是调度要做的内容。

作者提供了三种方法进行调度:

  1. 静态不排序分配:以贪婪的方式直接进行分配,把当前Query发送给累计代价最小的cluster;
  2. 静态排序分配:首先将query按照代价降序排列,剩下的和1是相同的;
  3. 动态排序分配(最佳):首先排序,然后每个cluster分配一个任务,之后的任务分配按照完成时间来确定,即按照真实代价来分配。

3.2 Load Balancing

3.2.1 Single-Node Query Answering

首先讲单节点是如何做查询的。

image.png

3.2.2 Work-Stealing Algorithm

节点之间的work-stealing机制其实也很简单,一个节点空闲了之后,会随机选择同组内未完成复制的节点发送请求,该节点如果被帮助次数不超过N_send的话,就发过去一个排在PQ array最后一位的,也是最有可能没什么用的PQ所在的RS batch,让其帮忙协同处理。

3.3 Data Replication

这里有一个trade-off,复制越多,查询性能越好,但是可伸缩性就会变差。两个极端是完全不复制(均等分割数据集)和每个节点都包含数据集全集。Odyssey会在这里取一个折衷。

image.png

3.4 Data Partitioning

每条Query都会发送给每个复制组进行查询,不同复制组之间通过一个共享的BSF通道进行同步,周期性地获取当前的BSF。

3.4.1 DENSITY-AWARE Data Partitioning

在分区这一步,作者首先考虑的是负载均衡,即对任意一条query,它在各个节点上的工作量应该差不多,如果一个节点有特别多的knn,其他节点几乎没有,就会产生工作量的倾斜,最终影响时延。

5 Experimental Evaluation

上一篇 下一篇

猜你喜欢

热点阅读