Как хранить данные в HBase для эффективного извлечения с частичным сканированием ключа?
Мой ключ состоит из трех компонентов: num, type, name
Тип имеет только два вида A и B, в то время как num может иметь больше значений, например, 0,1,2..,30
Я должен получить данные относительно числа и типа, т.е. выбрать все строки, которые имеют ключи с указанным числом и типом.
Я могу хранить данные в виде:
1. num|type|name
или 2. type|num|name
Учитывая, как HBase сканирует данные, если я использую частичное сканирование ключей, какова лучшая стратегия для хранения данных?
Вот как я настрою частичное сканирование ключей: для 1.
scan.setStartRow(Bytes.toBytes(num);
scan.setStopRow(Bytes.toBytes(num+1);
За 2.
scan.setStartRow(Bytes.toBytes(type + "|" + num);
scan.setStopRow(Bytes.toBytes(type + "|" + (num+1));
2 ответа
Во-первых, я бы рекомендовал не использовать pipe в качестве разделителя - то есть ASCII 124, и он падает после всех букв и цифр, и сортировка будет не тем, что вы ожидаете (если вы не оставили все отступы - но это приводит к слишком большим клавишам). Для разделителей строки HBase вы хотите использовать лексикографически что-то перед всеми вашими действительными ключевыми символами, чтобы сохранить правильную сортировку. Tab хорошо работает в ASCII 9.
Учитывая, что тип имеет только два допустимых значения, и предполагая случайное распределение, я бы пошел с num type
, Это позволяет вам выбрать только на номер, если вам нужно в будущем. Выбор только на Num с обратным порядком, type num
, это две выборки, один раз для типа 'A' и снова для типа 'B'. Не самый эффективный.
Если вы редко выбираете только номер, то имеет смысл type num
поскольку это наиболее избирательно на уровне строк, если негибко.
На самом деле вы должны попробовать их оба и посмотреть, что лучше всего работает с вашими данными.
Есть несколько подходов, которые вы можете использовать.
1) Вы должны выбрать макет, который будете сканировать чаще. Затем для менее частого типа сканирования вы выполняете полное сканирование (или ограничиваете его диапазоном, если это возможно), и, используя фильтры, вы можете создать фильтр строк, который отфильтровывает все, кроме элементов, которые вы хотите. Относительно фильтров: http://hbase.apache.org/apidocs/index.html
2) Вы можете продублировать свои данные, сохранив их дважды (по одному с каждым именем строки). Это замедляет запись, но очень помогает при чтении, если вы выполняете сканирование на обоих. Конечно, использование диска также удваивается.
3) Вы можете создать индекс с альтернативными именами строк, чтобы указывать на соответствующие строки.
Какой подход вы выберете, будет сильно зависеть от схем доступа к вашим данным и соотношения чтения / записи.