Bucketing
Краткое руководство по выбору между Hash Bucketing и Random Bucketing в Selena, включая их механизмы, компромиссы и рекомендуемые случаи использования.
Быстрое сравнение
| Аспект | Hash Bucketing | Random Bucketing |
|---|---|---|
| Пример | DISTRIBUTED BY HASH(id) BUCKETS 16 | DISTRIBUTED BY RANDOM |
| Объявление ключа | Требуется HASH(col1, …) | Отсутствует – строки назначаются по принципу round‑robin |
| Н ачальное количество bucket при пропуске | Автоматически выбирается при CREATE, затем фиксируется | Автоматически выбирается при CREATE; может расти при установке bucket_size |
| Разделение / сжатие tablet | Ручное ALTER … BUCKETS | Автоматическое разделение ⇢ только рост (≥ v3.2) |
| Устойчивость к перекосу | Зависит от кардинальности ключа | Высокая – равномерная по дизайну |
| Bucket pruning | ✅ (фильтры, соединения) | 🚫 (полное сканирование tablet) |
| Colocate joins | ✅ | 🚫 |
| Local aggregation / bucket-shuffle joins | ✅ | 🚫 |
| Поддерживаемые типы таблиц | Все | Только таблицы Duplicate Key |
Hash Bucketing
Как это работает
Строки назначаются tablet путем хеширования одного или нескольких столбцов. Количество tablet фиксируется после создания, если не изменяется вручную.
Требования
- Необходимо заранее выбрать стабильный, равномерно распределенный ключ с высокой кардинальностью. Кардинальность должна быть обычно в 1000 раз больше количества BE узлов, чтобы предотвратить перекос данных между hash bucket.
- Изначально выберите подходящий размер bucket, в идеале от 1 до 10 ГБ.
Преимущества
- Локальность запросов – селективные фильтры и соединения затрагивают меньше tablet.
- Colocate joins – таблицы фактов/измерений могут использовать общие hash ключи для высокоскоростных соединений.
- Предсказуемая структура – строки с одинаковым ключом всегда располагаются вместе.
- Local aggregation & bucket‑shuffle joins – идентичная hash структура между партициями обеспечивает локальную агрегацию и снижает затраты на перемешивание данных для больших соединений
Недостатки
- Уязвим к горячим tablet при перекосе распределения данных.
- Количество tablet статично; масштабирование требует DDL обслуживания.
- Недостаточное количество tablet может негативно повлиять на загрузку данных, сжатие данных и параллелизм выполнения запросов.
- Чрезмерное использование tablet увеличит объем метаданных.
Пример: Соединение измерений и фактов и Tablet Pruning
-- Таблица фактов, разделенная и hash‑bucketed по (customer_id)
CREATE TABLE sales (
sale_id bigint,
customer_id int,
sale_date date,
amount decimal(10,2)
) ENGINE = OLAP
DISTRIBUTED BY HASH(customer_id) BUCKETS 48
PARTITION BY date_trunc('DAY', sale_date)
PROPERTIES ("colocate_with" = "group1");
-- Таблица измерений hash‑bucketed по тому же ключу и количеству bucket, размещенная с таблицей sales
CREATE TABLE customers (
customer_id int,
region varchar(32),
status tinyint
) ENGINE = OLAP
DISTRIBUTED BY HASH(customer_id) BUCKETS 48
PROPERTIES ("colocate_with" = "group1");
-- Selena может выполнить tablet pruning
SELECT sum(amount)
FROM sales
WHERE customer_id = 123
-- Selena может выполнить local aggregation
SELECT customer_id, sum(amount) AS total_amount
FROM sales
GROUP BY customer_id
ORDER BY total_amount DESC LIMIT 100;
-- Selena может выполнить colocate join
SELECT c.region, sum(s.amount)
FROM sales s JOIN customers c USING (customer_id)
WHERE s.sale_date BETWEEN '2025-01-01' AND '2025-01-31'
GROUP BY c.region;