通常建议通过 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/

10-16 02:04