gpt4 book ai didi

hadoop - HBase中startrow和stoprow的使用如何不导致全表扫描?

转载 作者:可可西里 更新时间:2023-11-01 14:25:56 25 4
gpt4 key购买 nike

通常建议通过 startrowstoprow 使用范围扫描,而不是 Rowkey Prefix Filter(例如,here) .这样做的原因是因为 Rowkey Prefix Filter 会导致对 rowkey 进行全表扫描,而通过 startrowstoprow 进行范围扫描会不会导致全表扫描。为什么不呢?大多数人说“因为 rowkey 是按字典顺序存储的”,这当然不能解释为什么 Rowkey Prefix Filter 不能利用这一点。

无论如何,通过 startrowstoprow 进行的范围扫描为什么不会导致对行键进行全表扫描?

在 python 中举这个小例子来说明为什么我不明白行键的字典顺序在避免全表扫描方面有什么意义:

rowkeys = ['a1', 'a2', 'a3', 'b1', 'b2', 'b3', 'c1', 'c2', 'c3']

def range_scan(startrow, stoprow):
is_found = False
for rowkey in rowkeys:
if startrow <= rowkey < stoprow:
is_found = True
yield rowkey
else:
if is_found:
raise StopIteration()

显然,HBase 算法与此不同。怎么做到的?

TLDR:在使用 startrow 和 stoprow 进行范围扫描时,HBase 究竟如何避免全表扫描?

最佳答案

在 HBase 中,一个表被分成多个区域。区域是由特定区域服务器提供服务的一组行。区域服务器具有(通常)来自多个表的多个区域,它处理请求。

因为行是按键排序的,所以在 hbase master 中知道哪些开始键和停止键是每个区域的边界,以及可以在哪个区域服务器上查询该区域。

因此,如果使用显式开始和停止行完成扫描,则查询将仅定向到具有可能在请求范围内的键的区域/区域服务器。

如果查询的键范围“很小”,那么您会发现几乎所有查询都只访问一个区域。

一个 HBase 表通常有几十个区域,通过使用开始和停止行来限制扫描,您可能会发现表的 100 个区域中有 99 个甚至不知道表上的查询已经完成完成。

关于hadoop - HBase中startrow和stoprow的使用如何不导致全表扫描?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40197883/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com