Перейти к основному содержимому
Версия: 2.0.x

Сброс на диск

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

Обзор

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

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

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

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

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

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

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

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

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

    ПРИМЕЧАНИЕ

    • Вы можете указать несколько spill_local_storage_dir, разделяя их точкой с запятой (;).
    • В производственной среде мы настоятельно рекомендуем использовать разные диски для хранения данных и сброса. Когда промежуточные результаты сбрасываются на диск, может произойти значительное увеличение как нагрузки на запись, так и использования диска. Если используется один и тот же диск, этот всплеск может повлиять на другие запросы или задачи, выполняющиеся в cluster.
  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.

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

Начиная с версии v1.5.2, 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 не поддерживает установку лимита размера сброшенных данных на локальные диски индивидуально для каждого запроса. Поэтому параллельные запросы со сбросом могут влиять друг на друга.