Конструкция ключа строки HBase: соответствие любому из двух столбцов - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть некоторые данные, которые среди прочих содержат столбцы colA и colB. Для любой строки значения в colA и colB различны.

Я получаю запросы типа SELECT * FROM table WHERE colA = X or colB = X. Для оптимизации я проиндексировал colA и colB в MySQL.


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

Я думал об этом подходе:

Дублируйте каждую строку в MySQL. Для одной копии используйте colA + randomString в качестве ключа строки. Для другого используйте colB + randomString. (Добавьте случайную строку, потому что каждый ключ строки должен быть уникальным).

  • Хорошо: мне нужен только один запрос. т.е. вернуть все строки, где ключ строки имеет префикс X

  • Плохо: я удваиваю размер базы данных

Каким может быть альтернативный подход, который более экономит место при сохранении производительности?

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

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

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

Итак, чтобы ответить на ваш вопрос, ваш подход идеально подходит. Хотя я бы добавил исходные идентификаторы столбцов, разделенные разделителем (вместо случайной строки), в ключ строки на случай, если в будущем вам потребуется выбрать значение только для одного из столбцов. Более того, поместите идентификаторы столбцов в качестве префикса (а не суффикса) ключа строки, а затем вы можете передать фильтры ключа строки (разделенные ИЛИ) и ваши шкалы настройки для любого числа столбцов, где вы можете выбрать подмножество столбцов и при этом сохранить производительность.

Альтернативный подход к его просмотру - использование мощности HBase для выполнения миллионов записей в секунду, но при этом сохраняется исходное реляционное представление при запросе данных. По сути, это означает, что вам нужны вторичные индексы по интересующим столбцам. Apache Phoenix предоставляет все это вам поверх HBase; Это очень активный проект, который обеспечивает лучшее из обоих миров (интенсивная запись HBase и SQL-подобных фильтров) с добавленной стоимостью хранения вторичных индексов (которые вы в любом случае платите в любой реляционной базе данных).

0 голосов
/ 11 ноября 2018

Вы можете определить таблицу HBase для семейства столбцов, в которой все столбцы совпадают с таблицей mysql.

HBase поддерживает фильтр SingleColumnValueFilter для фильтрации записей по значению столбца.Вы можете сравнить значения ColA и ColB с оператором OR.

Следовательно, нет необходимости добавлять префикс или суффикс в ключ строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...