Вы можете создать составной ключ типа <timestamp><id>
, и тогда все записи в hbase будут упорядочены по отметке времени.Затем вы можете создать сканер, который начинается в начале диапазона и заканчивается в конце диапазона.
Одна проблема, с которой вы можете столкнуться, заключается в том, что при высокой скорости вставки у вас будет одинСервер будет горячей точкой для всех новых записей.Один из способов обойти это - инвертировать ключ и убедиться, что первая часть случайна: <sha1 of ID><timestamp>
.Преимущество заключается в распределении записей по всему кластеру, но недостатком является необходимость чтения всей таблицы для получения определенного диапазона.
Если вы используете первый метод <timestamp><id>
, то ваша картазадание может быть не в состоянии разделить работу на столько кусков, сколько вам хотелось бы.По умолчанию таблица разбивает работу на регионы.Если ваш временной интервал достаточно мал, у вас может быть один регион, обслуживающий данные, и вы не получите параллелизма в вашем запросе.Возможно, у вас может быть пользовательское разбиение таблицы, которое распараллеливает запрос по большему количеству картографов, чем по регионам, но вы все равно будете читать все данные из одного региона, что также может иметь недостатки для параллелизма.
Как вынастройка таблицы зависит от прогнозируемого сценария использования и соотношения чтения и записи, а также от того, насколько высока производительность для каждого из них.
Если вы добавите идентификатор к своей отметке времени, чтобы обеспечить уникальность, вы все равно сможетеполучить сканер для возврата всех событий с заданной отметкой времени.HBase сортирует ключи лексографически на основе представления байтов.Таким образом, если ваш ключ <timestamp>:<id>
, вы можете настроить сканер на запуск в строке <timestamp>
и остановку строки в <timestamp+1>
, чтобы получить все события на этой отметке времени