Как хранить данные в HBase для эффективного извлечения с помощью сканирования с частичным ключом? - PullRequest
3 голосов
/ 12 августа 2011

Мой ключ состоит из трех компонентов: номер, тип, имя

«Тип» имеет только два вида A и B в то время как num может иметь больше значений, например 0,1,2 .., 30

Мне нужно извлечь данные по num и набрать, т.е. получить все строки, в которых есть ключи с указанными num и типом.

Я могу хранить данные в виде: 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 ]

4 голосов
/ 12 августа 2011

Во-первых, я бы рекомендовал не использовать pipe в качестве разделителя - то есть ASCII 124, и он падает после всех букв и цифр, и сортировка не будет соответствовать вашим ожиданиям (если вы не оставили все на клавиатуре - но это слишком большие клавиши). Для разделителей строки HBase вы хотите использовать лексикографически что-то перед всеми вашими действительными ключевыми символами, чтобы сохранить правильную сортировку. Tab хорошо работает в ASCII 9.

Учитывая, что тип имеет только два допустимых значения, и предполагая случайное распределение, я бы выбрал num type. Это позволяет вам выбрать только на номер, если вам нужно в будущем. Выбор только num с обратным порядком type num - это две выборки, один раз для типа «A» и снова для типа «B». Не самый эффективный.

Если вы будете редко выбирать только по номеру, тогда имеет смысл использовать type num, так как это наиболее избирательно на уровне строк, если оно негибкое.

На самом деле вы должны попробовать их оба и посмотреть, что лучше всего работает с вашими данными.

1 голос
/ 16 августа 2011

Есть несколько подходов, которые вы можете предпринять.

1) Вы должны выбрать макет, который будете сканировать чаще. Затем для менее частого типа сканирования вы выполняете полное сканирование (или ограничивает его диапазоном, если вы можете), и, используя фильтры, вы можете создать фильтр строк, который отфильтровывает все, кроме элементов, которые вы хотите. По поводу фильтров: http://hbase.apache.org/apidocs/index.html

2) Вы можете дублировать свои данные, сохранив их дважды (по одному разу с каждым именем строки). Это замедляет запись, но очень помогает при чтении, если вы выполняете сканирование на обоих. Конечно, использование диска также удваивается.

3) Вы можете создать индекс с альтернативными именами строк, чтобы указывать на соответствующие строки.

Какой подход вы выберете, будет сильно зависеть от шаблонов доступа к вашим данным и отношения чтения / записи.

...