Нехватка памяти в Trino и как устранить OOM-ошибку

Trino курсы примеры обучение, Trino для разработчика, Trino примеры курсы обучение дата-инженеров, Школа Больших Данных Учебный Центр Коммерсант

Почему в кластере Trino может возникнуть OOM-ошибка и как справиться с нехваткой памяти, оптимизировав SQL-запросы и настроив конфигурации: примеры и рекомендации.

Причины OOM-ошибок в кластере Trino и как их устранить

Для Trino, как и для многих JVM-приложений, характерны проблемы с управлением памятью, включая возникновение OOM-ошибок (Out Of Memory). Это связано с тем, что Trino работает на виртуальной машине Java, которая управляет памятью через кучу (heap). Несоответствующая настройка параметров памяти JVM или интенсивные запросы могут привести к исчерпанию доступной памяти.

Напомним, кластер Trino состоит из координатора и нескольких рабочих узлов. Нагрузка координируется координатором и распределяется параллельно по всем рабочим процессам в кластере. Каждый узел запускает Trino в одном экземпляре JVM, а обработка дополнительно распараллеливается с помощью потоков. Неправильно настроенная конфигурация кластера, например, неравномерная балансировка нагрузки между узлами, может привести к тому, что некоторые узлы будут перегружены, а другие недогружены, что потенциально чревато OOM-ошибками. Однако, на практике, нехватка памяти обычно возникает при работе с большими наборами данных из разных источников при выполнении сложных запросов или обработке крупных промежуточных результатов. Некорректная работа драйверов или плагинов тоже может приводить к утечкам памяти или другим проблемам, вызывающим ошибки OOM, но чаще это случается в Trino по следующим причинам:

  • неоптимальные запросы;
  • некорректная настройка конфигураций.

Когда запрос обрабатывает слишком много строк/столбцов или использует сложные функции агрегации и многотабличные соединения, то промежуточные результаты могут занимать большое количество памяти. Кроме того, временные таблицы, создаваемые в процессе выполнения запроса, могут занимать значительное количество памяти. Если эти таблицы слишком большие или их создается много, это тоже может привести к исчерпанию доступной памяти. Еще кэширование результатов запросов также потребляет память. Если кэшируется много данных, это может привести к исчерпанию ресурсов и возникновению OOM.

Параллельное выполнение нескольких запросов одновременно может привести к перегрузке системы и возникновению ошибок OOM. Это особенно актуально, если каждый запрос требует значительных ресурсов. Это основная причина OOM-ошибок, когда системе не хватает оперативной памяти для завершения операции. Впрочем, иногда планировщик запросов может выбирать неэффективный способ обработки данных, что приводит к увеличению использования памяти. Кэширование результатов тоже может вызывать утечки памяти, поскольку в некоторых случаях Trino кэширует промежуточные данные, чтобы ускорить выполнение последующих запросов.

Поэтому рекомендуется избегать операций, требующих слишком большого объема памяти: многотабличных соединений и агрегации на больших наборах данных. Использование индексов и ключей может значительно снизить потребление памяти. Также следует ограничивать объем обрабатываемых данных, фильтруя их с помощью условий WHERE и указывая нужные столбцы в SELECT-запросе. Еще можно разбивать сложные запросы на более простые, чтобы снизить потребление памяти при выполнении каждой отдельной операции. Добавление оператора LIMIT в запрос поможет ограничить количество возвращаемых строк.

Еще одной причиной OOM-ошибки может быть неоптимальная настройка параметров конфигурации, когда запросы потребляют больше памяти, чем необходимо. Например, если размер рабочих узлов или количество параллельных потоков установлено неправильно. Если сервер, на котором работает Trino, имеет недостаточный объем физической оперативной памяти для обработки данных, система может исчерпать ресурсы и выдать ошибку OOM. В этом случае необходимо либо увеличить объем доступной памяти, либо оптимизировать запросы так, чтобы они потребляли меньше ресурсов. Самый простой способ исправить это – увеличить объем оперативной памяти, доступный для Trino. Это делается через увеличение значений параметров -Xmx и -Xms в файле конфигурации Java. Понять, что памяти JVM не хватает  и предупредить возникновение OOM-ошибки можно с помощью инструментов мониторинга, таких как JMX.

Кроме конфигурации JVM, в самом Trino есть множество настроек управления памятью:

  • max-memory-per-node – максимальный объем памяти, который может использовать каждый узел для выполнения одного запроса. По умолчанию он равен 10% от общей доступной памяти узла.
  • max-total-memory-per-node – общий объем памяти, который может использоваться всеми запросами на одном узле одновременно;
  • concurrency – максимальное количество задач, которые могут выполняться параллельно на каждом узле. Слишком высокое значение может привести к избыточному использованию памяти.

Чтобы обеспечить нормальную работу операционной системы и других процессов без риска возникновения OOM-ошибок, рекомендуется выделять не более 70% памяти на сервере Trino для JVM. Лучше иметь меньше мощных серверов с большим объемом памяти, поскольку каждый рабочий узел будет требовать некоторые накладные расходы памяти. Сервер с 16 ГБ памяти тратит гораздо больший процент своей емкости на накладные расходы, чем сервер с 128 ГБ памяти.

Размер дискового пространства на серверах зависит от настроек конфигурации. При обычном (не отказоустойчивом) выполнении для работы операционной системы, установки Trino и логов достаточно всего 50 ГБ. Но для кластера с отказоустойчивым выполнением и включенной буферизацией обмена в локальной файловой системе, понадобится намного больше дискового пространства. Потребление дискового пространства также растет при выполнении операций с интенсивным использованием памяти, когда Trino позволяет выгружать промежуточные результаты операций на диск. О том, как работает этот spill-механизм и что с ним не так, читайте в новой статье.

Научиться работать с Trino вам помогут специализированные курсы в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:

Источники

  1. https://www.starburst.io/blog/solving-capacity-management-problems-for-trino-clusters/
  2. https://trino.io/docs/current/admin/spill.html
Я даю свое согласие на обработку персональных данных и соглашаюсь с политикой конфиденциальности.
Поиск по сайту