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

Я читаю спецификацию HAWQ. Есть вопрос: я создаю таблицу (типа table_random) с распределением случайным образом в кластере из 3-х узлов данных, и места на диске для каждого сегмента почти не хватает. Затем я добавляю новый узел данных в кластер, затем, когда я вставляю данные в таблицу table_random,

- Does HAWQ will distribute data to the old data-nodes ? What will happen actually?
- Does HQWQ will redistribute the data of table 'table_random' overall the cluster?

Благодарность


person Leo.Liu    schedule 24.01.2017    source источник


Ответы (1)


Вы можете создавать таблицы в 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
comment
Привет Джон Робертс, большое спасибо за ваш ответ. У меня все еще есть проблема: после того, как я расширил свой кластер, будет ли HAWQ записывать данные (вызывать выполнение запроса INSERT) на узлы данных, на которых недостаточно места на диске? Благодарность - person Leo.Liu; 25.01.2017
comment
Сегмент HAWQ будет записывать в локальный узел данных на INSERT, а затем HDFS сделает копии этих данных для избыточности. Если у вас есть один узел с недостаточным пространством, вы должны запустить балансировщик hdfs, чтобы перераспределить данные между новыми узлами. Копии данных — это функция hdfs, а не HAWQ. - person Jon Roberts; 25.01.2017
comment
Понятно. Спасибо большое :) - person Leo.Liu; 27.01.2017