Как эффективно сканировать строки HBase - PullRequest
10 голосов
/ 22 января 2012

Мне нужно написать задание MapReduce, которое получает все строки в заданном диапазоне дат (скажем, за последний месяц).Это был бы лёгкий ход, если бы «Мой ключ от строки» начинался с Даты.Но Мои частые запросы Hbase касаются начальных значений ключа.

Мой ключ строки в точности равен A | B | C | 20120121 | D .Где комбинация A / B / C вместе с датой (в формате YearMonthDay) создает уникальный идентификатор строки.

Мои таблицы Hbase могут иметь до нескольких миллионов строк.Должен ли мой Mapper прочитать всю таблицу и отфильтровать каждую строку, если она попадает в заданный диапазон дат, или Scan / Filter может помочь справиться с этой ситуацией?

Может ли кто-нибудь предложить (или фрагмент кода) способ справиться с этой ситуацией?эффективным способом?

Спасибо -Panks

Ответы [ 4 ]

10 голосов
/ 26 декабря 2012

RowFilter с фильтром RegEx будет работать, но не будет самым оптимальным решением. В качестве альтернативы вы можете попробовать использовать вторичные индексы.

Еще одно решение - попробовать FuzzyRowFIlter . FuzzyRowFilter использует своего рода ускоренную пересылку, поэтому пропускает много строк в общем процессе сканирования и, следовательно, будет быстрее сканирования RowFilter. Вы можете прочитать больше об этом здесь .

Кроме того, BloomFilters может также помочь в зависимости от вашей схемы. Если ваши данные огромны, вам следует провести сравнительный анализ вторичного индекса и фильтров Блума.

5 голосов
/ 23 января 2012

Вы можете использовать RowFilter с RegexStringComparator . Вам нужно придумать RegEx, который фильтрует ваши даты соответствующим образом. Эта страница содержит пример, который включает установку фильтра для сканера MapReduce.

0 голосов
/ 23 января 2012

Вы можете изменить сканирование, которое вы отправляете в Mapper, чтобы включить фильтр.Если ваша дата также является меткой времени записи, это просто:

Scan scan = new Scan();
scan.setTimeRange(minTime, maxTime);
TableMapReduceUtil.initTableMapperJob("mytable", scan, MyTableMapper.class, 
     OutputKey.class, OutputValue.class, job);

Если дата в вашем ключе строки отличается, вам нужно будет добавить фильтр в ваш скан.Этот фильтр может работать с ключом столбца или строки.Я думаю, что это будет грязно только с ключом строки.Если вы поместите дату в столбец, вы можете сделать FilterList, где все условия должны быть выполнены, и использовать CompareOp.GREATER и CompareOp.LESS.Затем используйте scan.setFilter(filterList), чтобы добавить ваши фильтры в сканирование.

0 голосов
/ 22 января 2012

Я только начинаю работать с HBase, фильтры Блума могут помочь.

...