2016-06-11 4 views
0

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

RowKey = md5 (идентификатор_сервер) + метка время [32 шестнадцатеричных символов + 10 цифр = 42 символов]

Один из вариантов использования является перечислить все события от времени t1 до t2. Для этого обычное сканирование занимает слишком много времени. Чтобы ускорить это, я сделал следующее:

  1. Извлечь список уникальных серверов из другой таблицы (очень быстро).
  2. Разделите приведенный выше список в 256 ведрах на основе первых двух шестнадцатеричных символов md5 serverIds.
  3. Для каждого ведра вызовите сопроцессор (параллельные запросы) со списком 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?

+0

ответ ниже предлагает фильтр метки времени, но для этого требуется сканирование уровня ячейки, в вашем решении используются только клавиши rowkeys и будет намного быстрее. – halil

+0

Решение, которое я описал в вопросе, является быстрым, и я доволен производительностью. Мой вопрос касается долгосрочного воздействия на HBase с учетом количества сканирований на сервере. –

+0

Да, это влияет на производительность при увеличении числа обслуживаний. – halil

ответ

0

Попробуйте использовать фильтр временной отметки. следующий синтаксис для тестирования в Hbase оболочки import java.util.ArrayList import org.apache.hadoop.hbase.filter.TimestampsFilter list=ArrayList.new() list.add(1444398443674) //START TIMESTAMP list.add(1444457737937) //END TIMESTAMP scan 'eventLogTable', {FILTER=>TimestampsFilter.new(list)}

Те же выходы API в Java и других языках.

Смежные вопросы