Hbase 扫描和获取之间的性能差异?

Hbase 扫描和获取之间的性能差异?,hbase,Hbase,我有一个包含8G数据的HBase表 当我在该表上使用部分键扫描来检索给定键的值时,我得到了几乎恒定的时间值检索 当我使用Get时,所花费的时间远远大于扫描。然而,当我查看代码内部时,我发现Get本身使用了扫描 有人能解释这个时差吗?正确,当您发出Get时,会在幕后进行扫描。确认:“每次发出get或扫描时,HBase扫描(sic)每个文件以查找结果。” 我无法确认你的结果,但我认为线索可能在于你的“部分键扫描”。在比较部分键扫描和get时,请记住,用于get的行键可能比用于扫描的部分键长得多 在这

我有一个包含
8G
数据的HBase表

当我在该表上使用部分键扫描来检索给定键的值时,我得到了几乎恒定的时间值检索

当我使用
Get
时,所花费的时间远远大于扫描。然而,当我查看代码内部时,我发现
Get
本身使用了
扫描


有人能解释这个时差吗?

正确,当您发出Get时,会在幕后进行扫描。确认:“每次发出get或扫描时,HBase扫描(sic)每个文件以查找结果。”

我无法确认你的结果,但我认为线索可能在于你的“部分键扫描”。在比较部分键扫描和get时,请记住,用于get的行键可能比用于扫描的部分键长得多

在这种情况下,对于Get,HBase必须进行确定性查找,以确定它需要匹配和获取的行键的确切位置。但是对于部分密钥,HBase不需要查找精确的密钥匹配,只需要找到该密钥前缀的更近似位置

答案是:视情况而定。我认为这将取决于:

  • 您的行键“schema”或组合
  • Get键的长度和扫描前缀
  • 你有多少地区

  • 可能还有其他因素

    在后端区域,扫描和获取的数量几乎相同。他们最后都被HRegion.RegionScannerImpl处决了。下面请注意,该类中的get()实例化RegionScanner-类似于调用扫描

    org.apache.hadoop.hbase.regionserver.HRegion.RegionScannerImpl

    public List<Cell> get(Get get, boolean withCoprocessor)
    throws IOException {
    
    List<Cell> results = new ArrayList<Cell>();
    
    // pre-get CP hook
    if (withCoprocessor && (coprocessorHost != null)) {
       if (coprocessorHost.preGet(get, results)) {
         return results;
       }
    }
    
    Scan scan = new Scan(get);
    

    在我看来,它们至少应该同样快。你能发布你的
    scan
    get
    查询吗?我认为你应该发布你的代码和表设计,这样我们就可以讨论了。
    RegionScanner scanner = null;
    try {
      scanner = getScanner(scan);
      scanner.next(results);