From WiscKey to Bourbon: A Learned Index for Log-Structured Merge Trees

我们介绍了BOURBON,一种利用机器学习提供快速查找的合并(LSM)树。我们基于对LSM设计的仔细分析得出的经验原则来设计和实现。BOURBON使用贪婪的分段线性回归来学习键分布,以最小的计算实现快速查找,并应用成本效益策略来决定何时学习是值得的。通过在合成数据集和真实数据集上的一系列实验,我们表明,与最先进的生产lsm相比,BOURBON通过1.23×-1.78×提高了查找性能。

一研究内容

    本文将学习索引的思想应用到lsm中。一个主要的挑战是,虽然学习索引主要是为只读设置定制的,但LSMs是为写设置优化的。写操作会破坏学习到的索引,因为在现有数据上学习到的模型现在必须更新以适应更改;因此,系统必须反复重新学习数据。然而,我们发现lsm非常适合学习索引。例如,虽然写操作会修改LSM,但树的大多数部分是不可变的;因此,学习一个预测键值对位置的函数只需要一次,只要不可变数据存在就可以使用。然而,随之而来的是许多挑战。例如,键或值的大小不定,使得学习预测位置的函数变得更加困难,过早地进行模型构建可能会导致大量的资源浪费。

BOURBON使用分段线性回归(piecewise linear regression),这是一种简单但有效的模型,能够以很小的空间开销实现快速训练(即学习)和推理(即查找)。BOURBON采用了文件学习:模型是建立在文件之上的,因为LSM文件一旦创建,就不会在原地修改。BOURBON实现了一个成本-收益分析器,动态地决定是否学习一个文件,在最大化收益的同时减少不必要的学习。虽然之前大多数关于学习索引的工作[13,20,31]在优化独立数据结构方面取得了进展,但BOURBON将学习集成到已经高度优化的生产质量系统中。BOURBON的实现比wiskkey增加了大约5K LOC(大约20K LOC)。

 Learned Indexes: a Good Match for LSMs?

我们首先分析学习到的索引是否对lsm有益,并研究它们在什么情况下可以提高查找性能。然后,我们提供了为什么即使在允许写入时,学习的索引也适用于lsm的直觉。基于对不同工作负载下isckey内部如何工作的测量,进行了深入研究,以验证我们的直觉。通过分析,我们得出了一套学习指南。

对于只读分析工作负载,与传统索引相比,学习索引提供了更高的查找性能。然而,学习索引的一个主要缺点(如[31]所述)是它们不支持插入和更新等修改[13,20]。修改的主要问题是它们会改变数据分布,因此必须重新学习模型;对于写负载较大的工作,必须经常重建模型,从而导致较高的开销。 

乍一看,学习到的索引似乎不适用于优化了LSMs的写负载较大的情况。然而,我们观察到LSMs的设计很适合学习到的索引。我们的关键认识是,虽然更新可以改变LSM树的一部分,但有很大一部分是不可变的具体来说,新修改的项缓存在内存结构中,或存在于树的高层结构中,而稳定数据则存在于树的低层结构中。鉴于数据集的很大一部分位于稳定的、较低的级别,对该部分的查找可以在不需要或很少重新学习的情况下变得更快。相比之下,高水平的学习可能没有那么有益:它们的变化速度更快,因此必须经常重新学习。

我们还意识到,sstable文件的不可变特性使其成为学习的理想单元。一旦学习后,这些文件将永远不会更新,因此在文件被替换之前,模型是有用的。此外,sstable中的数据是有序的;我们可以使用简单的模型来学习排序后的数据。一个级别是许多不可变文件的集合,也可以使用简单的模型作为一个整体来学习。一个级别的数据也是有序的:单个sstable是有序的,并且在sstable之间没有重叠的键范围。

Bourbon Design 

现在我们来介绍BOURBON,这是一种基于lsm的存储,它通过学习来加快索引速度。我们首先描述了BOURBON用来学习数据的模型(§4.1)。然后,讨论了BOURBON如何支持可变大小的值(§4.2)及其基本的学习策略(§4.3)。最后,我们解释了BOURBON的成本收益分析器,它动态地做出学习决策,在降低成本的同时最大化收益(§4.4)。

1 Learning the Data 

数据可以在两种粒度上学习:单个sstable或levels。这两个实体都是有序数据集。试图学习数据的模型的目标是预测键在排序数据集中的位置。例如,如果模型是为sstable文件构建的,它会根据给定的键预测文件偏移量。类似地,一个level模型会输出目标sstable文件及其偏移量。

我们对模型的要求是,它在学习和查找期间必须具有低开销。此外,我们希望模型的空间开销较小。我们发现分段线性回归(PLR)[4,27]很好地满足了这些要求;因此,BOURBON使用PLR对数据进行建模。PLR的原理是用一些线段表示一个排序数据集。PLR构造一个有误差界的模型;也就是说,每个数据点d都保证位于[dpos−δ, dpos + δ]的范围内,其中dpos是d在数据集中的预测位置,δ是预先指定的误差界。 

为了训练PLR模型,BOURBON使用了贪心PLR算法[47]。Greedy-PLR每次处理一个数据点;如果某个数据点不能在不超出误差边界的情况下加入到当前线段,则创建一条新的线段,并将该数据点加入到新的线段中。最后,Greedy-PLR生成一组表示数据的线段。Greedy-PLR算法的运行时间与数据点个数成线性关系。 

一旦学习了模型,推理就会很快:首先,找到包含键的正确线段(使用二分查找);在该线段内,通过将key与直线的斜率相乘并加上截距值,即可获得目标key的位置。如果键不存在于预测位置,则在误差范围内进行局部搜索。

2. Bourbon: Putting it All Together 

图6显示了BOURBON中的查找路径。如(a)所示,查找可以通过模型处理(如果目标文件已经学习),或者在基线路径中处理(如果模型还没有构建)。BOURBON中的基线路径类似于图1中LevelDB的基线路径,只是BOURBON将值分开存储,因此ReadValue从日志中读取值。 

 

总结:文中提出利用线段建模key的分布范围,实现学习索引。它解决了LSM-tree中不能实现插入和更新的现状。它的主要观点是在LSM-tree中大部分数据是不变的,只有在上层的小部分数据发生变化,因此可以利用学习索引实现key位置预测。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值