Автоматическое слияние чанков на выходе операций

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

Обзор

Один из распространённых сценариев обработки данных — фильтрация большой таблицы из множества чанков для получения небольшого результата с помощью операции Map без специальных флагов (Unordered Map). В силу устройства данного типа операций, фильтрация таблицы из n чанков в худшем случае может привести к n выходным чанкам вне зависимости от того, насколько мелкие чанки получаются в результате. Подобное поведение сказывается на потреблении чанковой квоты пользовательского аккаунта. Подробнее о квотировании можно узнать в разделе Квоты.

Итоговые чанки можно объединить с помощью операции Merge, но такой способ неудобен, так как требует запуска дополнительной операции, а также не спасает от того, что в пике требуется запас n чанков квоты, что для больших таблиц может составлять сотни тысяч чанков, тогда как чанковая квота является довольно дорогим ресурсом. Поэтому в YTsaurus реализовано автоматическое слияние чанков на выходе из операции, которое действует «на опережение», объединяя выходные чанки до того, как их накопится достаточно много, чтобы израсходовать квоту.

Автоматическое слияние работает со следующими ограничениями:

  • Доступно только для операций Unordered Map, Sorted Reduce.
  • Работает только для таблиц, в которые пишутся несортированные данные. Для операций с сортированным выходом ситуация осложняется тем, что выходные чанки нельзя объединять в произвольном порядке.
  • Недоступно, если задан параметр row_count_limit. Подробнее о данном параметре можно узнать в разделе Настройки операций.

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

Режимы работы автоматического слияния

Автоматическое слияние настраивается через секцию auto_merge, которую необходимо указать в спецификации операции. Секция представляет собой словарь, главным параметром в котором является ключ mode, который может принимать значения disabled, relaxed, economy, manual, задающие различные варианты поведения автоматического слияния.

Relaxed

Режим, который не ставит целью экономить квоту «в реальном времени», а пытается получить на выходе таблицу с чанками разумного размера. Фактически данный режим снимает с пользователя необходимость запускать Unordered Merge на выходной таблице, но при этом не гарантирует, что операция будет работать хорошо в условиях нехватки квоты.

Economy

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

Потребление квоты на чанки в режиме economy в идеальных обстоятельствах можно приближенно оценить как 4 * sqrt(n), где n — количество чанков, которые бы получились в выходной таблице без автоматического слияния. Такой результат не является гарантией, а только best effort поведением, для работы которого, например, необходимо, чтобы в количествах чанков, выдаваемых джобами, не было перекосов (если один джоб породит сразу 1000 чанков). В таком случае для фильтрации таблицы из ста тысяч чанков оказывается достаточно квоты в пару тысяч чанков.

Manual

Режим, в котором можно вручную настроить поведение автоматического слияния через следующие параметры в секции auto_merge:

  • max_intermediate_chunk_count — планировщик будет пытаться не выходить за указанное ограничение на использование квоты на промежуточные чанки. Тем не менее, абсолютно точно данный лимит соблюсти практически невозможно из-за внутренних особенностей формирования чанков.
  • chunk_count_per_merge_job — определяет размер порции чанков, которую планировщик будет пытаться объединить за один проход (не выходя при этом за ограничение в desired_chunk_size в job_io у Merge джобов, по умолчанию 1 ГБ).
  • chunk_size_threshold — лимит, позволяющий не объединять чанки, которые по размеру составляют нужный процент от установленного размера чанка. То есть слиянию будут подлежать только те чанки, размер которых меньше 10% (по умолчанию) от desired_chunk_size.

Disabled

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

Примечание

Режим economy (как и manual режим при определённом подборе параметров) довольно сильно ограничивает параллельность операции, что может приводить к её замедлению. Такое поведение объясняется тем, что невозможно запустить одновременно 10 000 джобов, укладываясь в ограничение, например, в 1000 промежуточных чанков, потому что джобы могут единовременно породить 10 000 чанков. В свою очередь, режим relaxed избавлен от подобной проблемы, при этом режим relaxed не пытается выдерживать ограничения по чанковой квоте в реальном времени.

Автоматическое слияние является дополнительной стадией операции и занимает время, поэтому по умолчанию автоматическое слияние отключено. В случае, если увеличение времени работы операции из-за автоматического слияния не критично, стоит использовать режим relaxed. Ожидается, что такой режим подойдёт большей части пользователей.

Примеры спецификаций

Пример спецификации с режимом relaxed:

{
  input_table_paths = [ "//tmp/input_table" ];
  output_table_paths = [ "//tmp/output_table" ];
  mapper = {
    command = "cat";
  };
  auto_merge = {
    mode = "relaxed"
  }
}

Пример спецификации с режимом manual:

{
  input_table_paths = [ "//tmp/input_table" ];
  output_table_paths = [ "//tmp/output_table" ];
  mapper = {
    command = "cat";
  };
  auto_merge = {
    mode = "manual";
    max_intermediate_chunk_count = 1000;
    chunk_count_per_merge_job = 10;
    chunk_size_threshold = 5;
  }
}