Перейти к основному содержимому

Выгрузка на диск

В этой теме описывается, как выгружать промежуточные результаты вычислений больших операторов на локальные диски и объектное хранилище.

Обзор

Системы баз данных, которые полагаются на вычисления в памяти для выполнения запросов, такие как Selena, могут потреблять значительные ресурсы памяти при обработке запросов с операторами агрегации, сортировки и соединения на больших наборах данных. Когда достигаются лимиты памяти, эти запросы принудительно завершаются из-за нехватки памяти (OOM).

Однако все еще есть случаи, когда вы хотите, чтобы определенные задачи, требующие много памяти, выполнялись стабильно, и производительность не является вашим главным приоритетом, например, построение материализованного представления или выполнение легкого ETL с INSERT INTO SELECT. Эти задачи могут легко исчерпать ваши ресурсы памяти и тем самым заблокировать другие запросы, выполняющиеся в вашем кластере. Обычно для решения этой проблемы вы можете только тонко настраивать эти задачи индивидуально и полагаться на вашу стратегию изоляции ресурсов для контроля параллелизма запросов. Это может быть особенно неудобно и вероятно потерпит неудачу в некоторых экстремальных сценариях.

Начиная с Selena v3.0.1, Selena поддерживает выгрузку промежуточных результатов некоторых операторов, требующих много памяти, на диски. С этой функцией вы можете обменять терпимое снижение производительности на значительное сокращение использования памяти, тем самым улучшив доступность системы.

В настоящее время функция выгрузки Selena поддерживает следующие операторы:

  • Операторы агрегации
  • Операторы сортировки
  • Hash join (LEFT JOIN, RIGHT JOIN, FULL JOIN, OUTER JOIN, SEMI JOIN и INNER JOIN) операторы
  • CTE операторы (Поддерживается с v3.3.4)

Включение выгрузки промежуточных результатов

Выполните следующие шаги для включения выгрузки промежуточных результатов:

  1. Укажите локальную директорию выгрузки spill_local_storage_dir, которая хранит выгруженные промежуточные результаты на локальном диске, в конфигурационном файле BE be.conf или конфигурационном файле CN cn.conf, и перезапустите кластер, чтобы изменение вступило в силу.

    spill_local_storage_dir=/<dir_1>[;/<dir_2>]

    ПРИМЕЧАНИЕ

    • Вы можете указать несколько spill_local_storage_dir, разделив их точкой с запятой (;).
    • В производственной среде мы настоятельно рекомендуем использовать разные диски для хранения данных и выгрузки. Когда промежуточные результаты выгружаются на диск, может произойти значительное увеличение как нагрузки записи, так и использования диска. Если используется тот же диск, этот всплеск может повлиять на другие запросы или задачи, выполняющиеся в кластере.
  2. Выполните следующий оператор для включения выгрузки промежуточных результатов:

    SET enable_spill = true;
  3. Настройте режим выгрузки промежуточных результатов, используя переменную сессии spill_mode:

    SET spill_mode = { "auto" | "force" };

    ПРИМЕЧАНИЕ

    Каждый раз, когда запрос с выгрузкой завершается, Selena автоматически очищает выгруженные данные, которые производит запрос. Если BE аварийно завершается до очистки данных, Selena очищает их при перезапуске BE.

    ПеременнаяПо умолчаниюОписание
    enable_spillfalseВключать ли выгрузку промежуточных результатов. Если установлено в true, Selena выгружает промежуточные результаты на диск для уменьшения использования памяти при обработке операторов агрегации, сортировки или соединения в запросах.
    spill_modeautoРежим выполнения выгрузки промежуточных результатов. Допустимые значения:
    • auto: Выгрузка автоматически запускается при достижении порога использования памяти.
    • force: Selena принудительно выполняет выгрузку для всех соответствующих операторов, независимо от использования памяти.
    Эта переменная действует только когда переменная enable_spill установлена в true.

[Предварительная версия] Выгрузка промежуточных результатов в объектное хранилище

Начиная с v3.3.0, Selena поддерживает выгрузку промежуточных результатов в объектное хранилище.

подсказка

Перед включением выгрузки в объектное хранилище вы должны создать том хранения для определения объектного хранилища, которое вы хотите использовать. Для подробных инструкций по созданию тома хранения см. CREATE STORAGE VOLUME.

После того как вы включили выгрузку на предыдущем шаге, вы можете дополнительно установить эти системные переменные, чтобы позволить промежуточным результатам выгружаться в объектное хранилище:

SET enable_spill_to_remote_storage = true;

-- Замените <storage_volume_name> на имя тома хранения, который вы хотите использовать.
SET spill_storage_volume = '<storage_volume_name>';

После включения выгрузки в объектное хранилище промежуточные результаты запросов, которые запустили выгрузку, будут сначала сохранены на локальных дисках узлов BE или CN, а затем в объектном хранилище, если достигнут лимит емкости локальных дисков.

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

Ограничения

  • Не все проблемы OOM могут быть решены выгрузкой. Например, Selena не может освободить память, используемую для вычисления выражений.
  • Обычно запросы с участием выгрузки указывают на десятикратное увеличение задержки запроса. Мы рекомендуем вам увеличить тайм-аут запроса для этих запросов, установив переменную сессии query_timeout.
  • Существует значительное снижение производительности при выгрузке в объектное хранилище по сравнению с выгрузкой на локальные диски.
  • spill_local_storage_dir каждого узла BE или CN разделяется между всеми запросами, выполняющимися на узле. В настоящее время Selena не поддерживает установку лимита размера выгруженных данных на локальные диски индивидуально для каждого запроса. Поэтому параллельные запросы с участием выгрузки могут влиять друг на друга.