【问题标题】:Should I use prefixfilter or rowkey range scan in HBase我应该在 HBase 中使用前缀过滤器还是行键范围扫描
【发布时间】:2012-06-12 03:31:02
【问题描述】:

不知道为什么用prefixfilter查询会很慢。谁能解释一下查询 HBase 的最佳方式,谢谢。

hbase(main):002:0> scan 'userlib',{FILTER=>org.apache.hadoop.hbase.filter.PrefixFilter.new(org.apache.hadoop.hbase.util.Bytes.toBytes('0000115831F8'))}
ROW               COLUMN+CELL                                                                                                                                
0000115831F8001   column=track:aid, timestamp=1339121507633, value=aaa                                                                                       
1 row(s) in 41.0700 seconds

hbase(main):002:0> scan 'userlib',{STARTROW=>'0000115831F8',ENDROW=>'0000115831F9'}                                                                                        
ROW               COLUMN+CELL                                                                                                                                
0000115831F8001   column=track:aid, timestamp=1339121507633, value=aaa                                                                                       
1 row(s) in 0.1100 seconds

【问题讨论】:

  • 这种做法的问题是,当最后一个字符是最大Byte值时,不能加1。如果放0,下一个字节加1,说明HBase 包含这个不是预期结果的结束键

标签: performance filter hbase database-scan


【解决方案1】:

HBase 过滤器 - 甚至是行过滤器 - 非常慢,因为在大多数情况下,它们会执行完整的表扫描,然后过滤这些结果。看看这个讨论:http://grokbase.com/p/hbase/user/115cg0d7jh/very-slow-scan-performance-using-filters

然而,行键范围扫描确实要快得多 - 它们相当于过滤表扫描。这是因为行键是按排序顺序存储的(这是 HBase 的基本保证之一,它是一种类似 BigTable 的解决方案),因此对行键的范围扫描非常快。更多解释在这里:http://www.quora.com/How-feasible-is-real-time-querying-on-HBase-Can-it-be-achieved-through-a-programming-language-such-as-Python-PHP-or-JSP

[UPDATE 1] 证明 PrefixFilter 确实会进行全表扫描,直到它通过过滤器中使用的前缀(如果找到它)。使用 PrefixFilter 获得快速性能的建议似乎是在 PrefixFilter 之外指定一个 start_row 参数。见related 2013 discussion on the hbase-user mailing list

[更新 2,来自@aaa90210] 关于上述更新,现在有一个比 PrefixFilter 快得多的高效行前缀过滤器,请参阅此答案:https://stackoverflow.com/a/38632100/150050

【讨论】:

  • 链接在这里并没有真正增加太多价值
  • 您的更新不再准确。有一个 ROWPREFIXFILTER 与 PrefixFilter 相同,请参阅此答案 stackoverflow.com/a/38632100/150050
  • 谢谢,更新了答案并感谢您的更新。
  • 第一次更新的链接坏了。您介意帮我们取回它吗?
【解决方案2】:

DATE:事实证明 PrefixFilter 确实会进行全表扫描,直到它通过过滤器中使用的前缀(如果找到它)。使用 PrefixFilter 获得快速性能的建议似乎是在 PrefixF 之外指定 start_row 参数

【讨论】:

    猜你喜欢
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    相关资源
    最近更新 更多