Вы можете создавать таблицы в HAWQ, которые задаются с помощью ключа распределения хэшей или случайным образом. В HAWQ 2.0 вы должны использовать случайное распределение, но сначала давайте поговорим о том, как работает распределение хэшей в HAWQ.
create table foo (id int, bar text) distributed by (id);
В HAWQ есть концепция сегментов для хеш-распределенных таблиц. По сути, в hdfs есть файл, соответствующий каждому сегменту. В многораздельной таблице есть файл для каждого раздела и для каждого сегмента, но давайте просто сосредоточимся на моей таблице foo выше.
Когда вы запускаете свою базу данных, устанавливается GUC default_hash_table_bucket_number. Он рассчитывается на основе количества узлов * 6. (Кластеры с 85-102 узлами составляют 5 * количество узлов и т. д.). Таким образом, кластер из 10 узлов будет иметь default_hash_table_bucket_number = 60. Следовательно, для моей таблицы foo в HDFS будет 60 файлов.
- Когда вы выполняете запрос к foo, для этой таблицы будет 60 виртуальных сегментов (по одному для каждого файла).
- Когда вы расширяете свой кластер, количество корзин для моей таблицы фиксируется. 60 сегментов по-прежнему будут работать, но они будут распределены по всем узлам.
- После расширения и использования хеш-распределения вы должны настроить default_hash_table_bucket_number на основе количества узлов в кластере, а затем заново создать хэш-распределенные таблицы, чтобы они имели правильное количество сегментов.
Вы также можете указать количество сегментов для таблицы at следующим образом:
create table foo (id int, bar text) with (bucketnum=10) distributed by (id);
Теперь я заставляю базу данных иметь 10 сегментов для моей таблицы, а не использовать значение из default_hash_table_bucket_number.
Но вместо хэша рекомендуется использовать случайно распределенные таблицы. Почему? Из-за эластичности.
create table foo_random (id int, bar text) distributed randomly;
Теперь эта таблица будет создавать только один файл в hdfs. Количество vseg определяется во время выполнения на основе оптимизатора запросов. Для маленькой таблицы оптимизатор может выполнять только один виртуальный сегмент, в то время как для очень большой таблицы может использоваться 6 виртуальных сегментов на хост.
При расширении кластера вам не нужно будет перераспределять данные. База данных автоматически увеличит общее количество виртуальных сегментов, если это необходимо.
hawq_rm_nvseg_perquery_perseg_limit — это GUC, который определяет, сколько возможных виртуальных сегментов будет создано для каждого запроса на сегмент. По умолчанию установлено значение 6, но вы можете увеличить или уменьшить его. hawq_rm_nvseg_perquery_limit — еще один важный GUC. По умолчанию он равен 512 и управляет общим количеством виртуальных сегментов, которые могут выполняться для всего кластера запросов.
Итак, в HAWQ со случайным распределением:
- Рекомендуемая техника хранения
- Добавление узлов не требует перераспределения данных
- Удаление узлов не требует перераспределения данных
- hawq_rm_nvseg_perquery_perseg_limit можно увеличить с 6 до более высоких значений для увеличения параллелизма.
- hawq_rm_nvseg_perquery_limit может потребоваться увеличить с 512 до более высокого значения. Он указывает общее количество виртуальных сегментов во всем кластере на запрос.
person
Jon Roberts
schedule
24.01.2017