我应该在HBase中使用prefixfilter还是rowkey范围扫描?

10

我不知道为什么使用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,然后再增加下一个字节的值,那么你就会指示HBase包括这个结束键,而这并不是期望的结果。 - Asaf Mesika
2个回答

25
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 [更新1]原来PrefixFilter会进行完整的表扫描,直到通过过滤器中使用的前缀(如果找到)。使用PrefixFilter以获得快速性能的建议似乎是在PrefixFilter中指定一个start_row参数。请参见相关2013年hbase-user邮件列表上的讨论:http://search-hadoop.com/m/TyTHkctw751
[更新2,来自@aaa90210] 关于上面的更新,现在有一种高效的行前缀过滤器,比PrefixFilter快得多,请参见此答案:https://dev59.com/RmMm5IYBdhLWcg3whPPq#38632100

6
这个链接在这里并没有太多的价值。 - Asaf Mesika
2
你的UPDATE语句不再准确。有一个ROWPREFIXFILTER,它与PrefixFilter不同,请参见此答案https://dev59.com/RmMm5IYBdhLWcg3whPPq#38632100。 - aaa90210
谢谢,已更新答案并将更新归功于您。 - Suman
1
第一次更新的链接已经失效了,您能帮我们找回来吗? - Matthew Moisen

0

日期:事实证明,PrefixFilter 在执行过程中会进行全表扫描,直到找到与过滤器中使用的前缀匹配的行(如果找到的话)。使用 PrefixFilter 实现快速性能的建议是除了使用 PrefixFilter 外还要指定 start_row 参数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接