Сканирование HBase с фильтрами сравнения имеет большую задержку при возврате последней строки

У меня есть HBase, работающий в автономном режиме, и я столкнулся с некоторыми проблемами при запросе таблиц с помощью Java API. Таблица содержит несколько миллионов записей (но может вырасти до миллиардов), которые имеют следующую метрику ключа строки:

<UUID>-<Tag>-<Timestamp>

Я использую два фильтра операции сравнения для запроса определенного диапазона строк, который представляет временной интервал.

Scan scan = new Scan();
RowFilter upperRowFilter = new RowFilter(CompareOp.LESS,
    new BinaryComparator(securityId + eventType + intervalEnd)
        .getBytes()));

RowFilter lowerRowFilter = new RowFilter(CompareOp.GREATER_OR_EQUAL,
    new BinaryComparator(securityId + eventType + intervalStart)
        .getBytes()));

FilterList filterList = new FilterList();
filterList.addFilter(lowerRowFilter);
filterList.addFilter(upperRowFilter);

scan.setFilter(filterList);
scanner = table.getScanner(scan);
result = scanner.next();

Когда я вызываю метод ResultScanner#next(), все работает нормально, пока не доберется до последней строки диапазона ключей, который указан через фильтры. Прежде чем ResultScanner вернет последнюю строку, которая лексически меньше верхнего предела диапазона строк, может пройти до 40 секунд.

Когда я меняю порядок фильтров в списке фильтров с

filterList.addFilter(lowerRowFilter);
filterList.addFilter(upperRowFilter);

to

filterList.addFilter(upperRowFilter);
filterList.addFilter(lowerRowFilter);

сканеру требуется до 40 секунд, пока он не начнет возвращать какие-либо результаты, но задержки при возврате последней строки больше нет, поэтому я решил, что задержка происходит из-за фильтра CompareOp.LESS.

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

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

У вас есть идеи, что может быть причиной такого поведения? Я делаю это неправильно или есть что-то, чего мне не хватает?

Заранее спасибо!


person Tobi    schedule 24.08.2011    source источник


Ответы (1)


Проблема в том, что ваш сканер сканирует всю таблицу и отбрасывает результаты, не соответствующие вашему запросу. Вам нужно явно установить строку остановки (securityId + eventType + intervalEnd). Если вы установите соответствующую начальную строку (securityId + eventType + intervalStart), то вам вообще не понадобится фильтр, и сканирование будет эффективным независимо от размера вашего набора данных.

person David    schedule 24.08.2011
comment
Да, спасибо, это решило проблему для меня! Но чего я не понимаю, так это почему сканер сканирует всю таблицу. Если найдена строка, превышающая (securityId + eventType + intervalStart), сканирование может быть остановлено... - person Tobi; 25.08.2011