Должен ли я использовать префиксный фильтр или сканирование диапазона строк в HBase

Я не знаю, почему это очень медленно, если я использую 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

2 ответа

Решение

Фильтры 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 рекомендуется указывать параметр start_row в дополнение к PrefixFilter. См. Соответствующее обсуждение 2013 года в списке рассылки hbase-user.

[ОБНОВЛЕНИЕ 2, от @aaa90210] Что касается вышеприведенного обновления, теперь существует эффективный фильтр префиксов строк, который намного быстрее, чем PrefixFilter, см. Этот ответ: /questions/6261566/hbase-easy-kak-vyipolnit-skanirovanie-prefiksa-diapazona-v-obolochke-hbase/6261576#6261576

ДАТА: оказывается, что PrefixFilter выполняет полное сканирование таблицы, пока не пройдет префикс, используемый в фильтре (если он его найдет). Похоже, что для быстрой работы с использованием PrefixFilter рекомендуется указывать параметр start_row в дополнение к PrefixF

Другие вопросы по тегам