Bucketing
Краткое практическое руководство по выбору между Hash Bucketing и Random Bucketing в Selena, включая их механику, компромиссы и рекомендуемые случаи использования.
Сравнительная таблица
| Аспект | Hash Bucketing | Random Bucketing |
|---|---|---|
| Пример | DISTRIBUTED BY HASH(id) BUCKETS 16 | DISTRIBUTED BY RANDOM |
| Объявление ключа | Требуется HASH(col1, …) | Нет — строки назначаются по кругу |
| Начальное количество bucket при пропуске | Выбирается автоматически при CREATE, затем фиксируется | Выбирается автоматически при CREATE; может расти, если установлен bucket_size |
| Разделение / сжатие tablet | Вручную ALTER … BUCKETS | Автоматическое разделение ⇢ только рост (≥ v1.5.2) |
| Устойчивость к перекосу | Зависит от кардинальности ключа | Высокая — равномерная по дизайну |
| Отсечение bucket | ✅ (фильтры, JOIN) | 🚫 (полное сканирование tablet) |
| Colocate JOIN | ✅ | 🚫 |
| Локальная агрегация / bucket-shuffle JOIN | ✅ | 🚫 |
| Поддерживаемые типы таблиц | Все | Только таблицы Duplicate Key |
Hash Bucketing
Как это работает
Строки назначаются tablet путем хеширования одного или нескольких столбцов. Количество tablet фиксируется после создания, если только не изменено вручную.
Требования
- Необходимо выбрать стабильный, равномерно распределенный ключ с высокой кардинальностью заранее. Кардинальность обычно должна быть в 1000 раз больше количества узлов BE, чтобы предотвратить перекос данных между хеш-bucket.
- Выберите подходящий размер bucket изначально, в идеале в диапазоне от 1 до 10 GB.
Сильные стороны
- Локальность запросов — выборочные фильтры и JOIN затрагивают меньше tablet.
- Colocate JOIN — таблицы фактов/измерений могут использовать общие хеш-ключи для высокоскоростных JOIN.
- Предсказуемая структура — строки с одним и тем же ключом всегда находятся вместе.
- Локальная агрегация и bucket-shuffle JOIN — идентичная хеш-структура между партициями позволяет локальную агрегацию и снижает затраты на перемешивание данных при больших JOIN.
Слабые стороны
- Уязвимость к горячим tablet, если распределение данных искажено.
- Количество tablet статично; масштабирование требует обслуживающего DDL.
- Недостаточное количество tablet может негативно повлиять на загрузку данных, компактирование данных и параллелизм выполнения запросов.
- Чрезмерное использование tablet увеличит объем метаданных.