как спроектировать схему Hbase?
Вопрос
предположим, что у меня есть эта таблица RDBM (Сущность-атрибут-value_model):
col1: entityID
col2: attributeName
col3: value
и я хочу использовать HBase из-за проблем с масштабированием.
Я знаю, что единственный способ получить доступ к таблице Hbase - это использовать первичный ключ (курсор).вы можете получить курсор для определенной клавиши и перебирать строки одну за другой .
Проблема в том, что в моем случае я хочу иметь возможность выполнять итерации по всем 3 столбцам.например :
- для данного EntityId я хочу получить все его атрибуты и значения
- для присвоения имени атрибута и значения я хочу указать все идентификаторы объектов ...
итак, у меня возникла идея создать одну таблицу Hbase, которая будет содержать данные (данные таблицы с EntityId в качестве основного индекса), и 2 таблицы "index", одну с attributeName в качестве первичного ключа, а другую со значением
каждая таблица индексов будет содержать список указателей (entityIDs) для таблицы ДАННЫХ.
Разумный ли это подход ?или это "злоупотребление" концепциями Hbase ?
HBase позволяет выполнять операции получения по первичному ключу и сканированию (подумайте:курсор) над строкой диапазоны.(Если у вас есть и масштаб, и необходимость во вторичных индексах, не беспокойтесь - Lucene спешит на помощь!Но это уже другой пост.)
Знаете ли вы , как Lucene может помочь ?
-- Йонатан
Решение
Вторичные индексы действительно были бы полезны для многих потенциальных приложений HBase, и я полагаю, что разработчики действительно рассматривают это.Оформить покупку http://www.mail-archive.com/hbase-dev@hadoop.apache.org/msg04801.html.
В то же время, однако, если хранилище данных вашего приложения можно смоделировать как звездообразную схему (см. http://en.wikipedia.org/wiki/Star_schema) возможно, вы захотите проверить решение, которое Hypertable предлагает для нужд вторичного индексного типа http://markmail.org/message/rphm4q6cbar2ycgp
Другие советы
Я рекомендую иметь два разных плоских стола:один для поиска атрибутов + значений, заданных EntityId, и один для поиска EntityId, заданных attributes + values.
Таблица 1 будет выглядеть следующим образом:
entityID1 {
attribute1: value1;
attribute2: value2;
...
}
и Таблица 2:
attribute1_value1 {
entityID1;
}
attribute2_value2 {
entityID1;
}