Правильный ли дизайн схемы HBase?

Я хотел бы спросить вас, подходит ли текущий дизайн схемы для таблицы HBase для следующего сценария: я получаю 10 миллионов событий в день, каждое из которых имеет метку времени эпохи Unix и идентификатор. Мне придется группировать по дням, чтобы я мог легко найти события, которые произошли в определенный день.

Текущий дизайн: временная метка событий преобразуется в строку формата "MM-YYYY_DD" в качестве ключа, и каждый идентификатор события, произошедшего в этот день, сохраняется в строке. Это приведет к появлению до 10 миллионов столбцов в одном ряду. Насколько я понимаю, HBase блокирует запись в одну строку. В результате возникает много блокировок при импорте одного дня и снижается производительность.

Может быть, это будет лучший дизайн?: Используйте метку времени эпохи Unix в качестве ключа строки, в результате чего получается много строк с несколькими тысячами столбцов (несколько событий могут происходить в одну и ту же секунду, потому что моя метка времени имеет максимальное разрешение в одну секунду). При сканировании можно рассчитать время начала и окончания в эпоху Unix и выполнить сканирование.

2 ответа

Решение

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

Вы хотите группирование / разбиение - тогда использование сканирования с фильтром не является плохим подходом. Вы можете запросить на основе столбца с "SingleColumnValueFilter". Performnce не будет оптимальным по сравнению со сканированием по ключам. Опять же, я не уверен, какое время отклика вы ожидаете.

Я просто перечислю некоторые знания по hbase, может быть, вам будет полезно принять решение о том, как лучше изменить свой дизайн.

HBase - это распределенная база данных на основе столбцов. Он распределяет записи по разным узлам на основе префикса ключа строки. Так что зависит от того, сколько у вас узлов, в вашем случае это будет работать следующим образом: записи за разные месяцы будут отправляться на разные узлы (все данные за все дни определенного месяца будут идти на один узел).

В то же время нормально иметь длинный ключ строки (с суффиксом eventid), который, скорее всего, не сильно повлияет на распределение. HBase позволяет строить запросы на сканирование, основанные на префиксе ключа строки, но не на точном совпадении.

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