2009-03-25 9 views
10

В документации по Hbase четко указано, что вы должны группировать аналогичные столбцы в семейства столбцов, поскольку физическое хранилище выполняется по семейству столбцов.Hadoop Hbase: Распространение семейств колонок по столам или нет

Но что значит помещать два семейства столбцов в одну и ту же таблицу, а не отдельные таблицы для каждой группы столбцов? Существуют ли конкретные случаи, когда «разделение» таблиц имеет смысл, и случаи, когда одна «широкая» таблица работает лучше?

Отдельные таблицы должны приводить к отдельным «регионам строк», что может быть полезно, когда некоторые семейства столбцов (в целом) очень разрежены. И наоборот, когда было бы выгодно иметь сгруппированные семьи?

ответ

8

У вас есть идея семейств столбцов: на самом деле это всего лишь намек на то, чтобы HBase хранил и копировал эти элементы для более быстрого доступа.

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

Например: если у меня есть столбцы для общего количества просмотров страниц для данного веб-сайта, количество уникальных просмотров для одного и того же сайта, браузер, который пользователь использует для просмотра сайта, и их подключение к Интернету, я могу решите, что я хочу, чтобы первые два были семейством столбцов, а последние два - другим семейством столбцов. Здесь все четыре доступны одним и тем же ключом, а именно рассматриваемый веб-сайт, поэтому я набираю их в одной таблице.

Если они находятся в разных таблицах, мне придется выполнить операцию объединения в двух таблицах. Я действительно не знаю числа, хотя я не могу сказать вам, насколько медленна операция, подобная соединению (так как я не помню, что HBase имеет соединение, так как это нереляционная), и что такое точка опроса, где происходит расщепление их на отдельные таблицы перевешивают их в одной таблице (или наоборот).

Конечно, все это зависит от данных, которые вы пытаетесь сохранить, поэтому, если вам никогда не понадобится присоединиться к таблицам, вы хотели бы сохранить их в отдельных таблицах, поскольку вы можете утверждать, что они не такие в первую очередь, связаны друг с другом.

+0

Вы говорите: «Присоединяйтесь дорого». Это означает, что «объединение» между группами столбцов в одной и той же таблице дешевле, чем объединение групп столбцов через таблицы. Это так? Я думаю, что документы HBase не делают этого ясным. – Thilo

+1

Я бы подумал, что гораздо дешевле делать «соединение» между столбцами в одной таблице, так как это просто операция «get» с двумя названными столбцами и является примитивным языком запросов. Однако «Join» не является примитивным, и вам нужно будет реализовать его самостоятельно (что требует больше операций). –

8

Семейство столбцов - это компромисс между ориентированным на строку и ориентированным на столбцы доступом. Чтобы расширить пример веб-страницы Криса, доступ к строке будет извлекать все данные (столбцы) для одного веб-сайта. Примером операции, ориентированной на столбцы, было бы суммирование количества просмотров страниц на всех сайтах.

Последняя операция не требует подробных сведений о браузере и соединении, которые намного превышают числовые значения для подсчета просмотров и существенно влияют на производительность запросов. Таким образом, HBase предоставляет семейства столбцов в качестве оптимизации, поддерживающей операции с столбцами.

Что касается того, должны ли столбцы находиться в одной таблице ... Я бы просто соблюдал нормативные правила моделирования данных и поместил все столбцы в одну и ту же таблицу, если они являются атрибутами одного и того же объекта. Семейства столбцов - это производительность, а не схема.

+1

«Семейство колонок - это не производительность, а производительность.» Это не было ясно для меня, пока вы просто не сказали это. Спасибо. –