【问题标题】:How does the use of startrow and stoprow not result in a full table scan in HBase?使用 startrow 和 stoprow 如何不会导致 HBase 中的全表扫描?
【发布时间】:2016-10-22 23:04:52
【问题描述】:

通常建议通过startrowstoprow 使用范围扫描,而不是Rowkey Prefix Filter(例如here)。这是因为Rowkey Prefix Filter 会导致对行键进行全表扫描,而通过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 如何避免全表扫描?

【问题讨论】:

    标签: hadoop hbase


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多