布隆过滤器在Cassandra中的作用是什么?

13

在Cassandra文档的两个不同链接中,我找到了以下内容:

链接1

一种存储在内存中的结构,在访问磁盘上的SSTable之前检查行数据是否存在于内存表中

链接2

Cassandra检查Bloom过滤器以发现哪些SSTable可能具有请求分区数据。

我的问题是上述两个陈述是否正确?如果是,那么布隆过滤器是为Memtable和SSTable分别维护的吗?提前感谢。

2个回答

36

Bloom filter是一种通用的数据结构,用于检查元素是否存在于集合中。它的算法被设计得非常快速,但有可能会返回错误的结果。

Cassandra使用Bloom过滤器来测试任何SSTable是否可能包含所请求的分区键,而无需实际读取其内容(从而避免昂贵的IO操作)。

如果给定的分区键的Bloom过滤器返回false,则可以确定该分区键不在相应的SSTable中;但如果返回true,则SSTable可能包含该分区键。当发生这种情况时,Cassandra将采用更复杂的技术来确定是否需要读取该SSTable。请注意,Bloom过滤器适用于大多数读取,并仅在某些写入期间更新(当memtable刷新到磁盘时)。您可以在此处了解有关Cassandra读取路径的更多信息。

回到您的问题:

1) 第一句话(“在访问磁盘上的SSTables之前,存储在内存中的结构检查行数据是否存在于memtable中”)在我看来不准确:布隆过滤器确实在将memtable刷新到磁盘时进行更新,但它们不引用memtable。

2) 布隆过滤器是按SSTable维护的,即磁盘上的每个SSTable都会在内存中得到相应的布隆过滤器。


“一个存储在内存中的结构,在访问硬盘上的SSTables之前检查行数据是否存在于memtable中”不准确:+1。” - Alex Mathew
我想了解布隆过滤器是在哪一列上构建的。假设我的表中有3列,第一列是我的分区键。因此,当我通过类似于where col1(partition_key)=?and col2 =?的搜索进行搜索时,由于col1是分区键,所以一旦到达该节点,每个SS表都将具有此col1,因为col1只会写入该节点,因此不需要在col1上保留布隆过滤器。因此问题是Cassandra在哪一列上创建布隆过滤器。 - Rajat Goyal

1
在读取路径中,Cassandra将磁盘上的数据(SSTables)与RAM中的数据(memtables)合并。为了避免检查请求的分区的每个SSTable数据文件,Cassandra采用了一种称为布隆过滤器的数据结构。
布隆过滤器是一种概率性数据结构,允许Cassandra确定两种可能状态之一:- 数据绝对不存在于给定文件中,或- 数据可能存在于给定文件中。
虽然布隆过滤器不能保证数据存在于给定的SSTable中,但通过允许其消耗更多的RAM,可以使布隆过滤器更加准确。运营商有机会通过将bloom_filter_fp_chance调整为0到1之间的浮点数来针对每个表调整此行为。
bloom_filter_fp_chance的默认值为0.1,适用于使用LeveledCompactionStrategy的表,对于所有其他情况,其值为0.01。
布隆过滤器存储在RAM中,但存储在堆外,因此运营商在选择最大堆大小时不应考虑布隆过滤器。随着精度的提高(当bloom_filter_fp_chance接近0时),内存使用量非线性增加- bloom_filter_fp_chance = 0.01的布隆过滤器将需要约三倍于具有bloom_filter_fp_chance = 0.1的相同表的内存。 典型的bloom_filter_fp_chance值通常在0.01(1%)到0.1(10%)之间,其中Cassandra可能会扫描SSTable以查找一行,但最终发现它不存在于磁盘上。该参数应根据用例进行调整:
  1. 具有更多RAM和较慢磁盘的用户可能会受益于将 bloom_filter_fp_chance设置为数字较低的值(例如0.01) 以避免过多的IO操作。
  2. 具有较少RAM、更密集节点或非常快速磁盘的用户可能 可以容忍更高的bloom_filter_fp_chance,以节省RAM 而牺牲过多的IO操作。
  3. 在很少读取或仅通过扫描整个数据集执行读取的工作负载中(例如分析工作负载),将bloom_filter_fp_chance设置为更高的数字是可以接受的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接