У меня есть таблица со сто миллионов записей. В этой таблице содержатся данные о серверах и событиях, которые на них основаны. Ниже приводится ключ строки таблицы:Производительность HBase с большим количеством сканирований
RowKey = md5 (идентификатор_сервер) + метка время [32 шестнадцатеричных символов + 10 цифр = 42 символов]
Один из вариантов использования является перечислить все события от времени t1 до t2. Для этого обычное сканирование занимает слишком много времени. Чтобы ускорить это, я сделал следующее:
- Извлечь список уникальных серверов из другой таблицы (очень быстро).
- Разделите приведенный выше список в 256 ведрах на основе первых двух шестнадцатеричных символов md5 serverIds.
- Для каждого ведра вызовите сопроцессор (параллельные запросы) со списком serverId, временем начала и временем окончания.
сопроцессор сканирование таблицы следующим образом:
for (String serverId : serverIds) {
byte[] startKey = generateKeyserverId, startTime);
byte[] endKey = generateKey(serverId, endTime);
Scan scan = new Scan(startKey, endKey);
InternalScanner scanner = env.getRegion().getScanner(scan);
....
}
Я могу получить результат быстро быстро с этим подходом. Моя единственная забота - большое количество сканирований. Если таблица содержит 20 000 serverIds, то приведенный выше код выполняет 20 000 сканирований. Будет ли это влиять на общую производительность и масштабируемость HBase?
ответ ниже предлагает фильтр метки времени, но для этого требуется сканирование уровня ячейки, в вашем решении используются только клавиши rowkeys и будет намного быстрее. – halil
Решение, которое я описал в вопросе, является быстрым, и я доволен производительностью. Мой вопрос касается долгосрочного воздействия на HBase с учетом количества сканирований на сервере. –
Да, это влияет на производительность при увеличении числа обслуживаний. – halil