繁体   English   中英

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

[英]How does the use of startrow and stoprow not result in a full table scan in HBase?

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

无论如何,通过startrowstoprow进行范围扫描的startrow stoprow不会导致对stoprow进行全表扫描?

以python中的这个小例子来说明为什么我不理解rowkeys的lexagraphical排序在避免全表扫描方面意味着什么:

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个甚至不知道表上的查询已经完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM