Как сделать запуск UDF-функций Python или R на узлах сегмента Greenplum более быстрым и безопасным с помощью Docker-контейнеров и расширения PL/Container.
Что такое PL/Container и как это использовать в Greenplum
Запуск пользовательского кода для базы данных всегда имеет риск нарушения информационной безопасности. Если речь идет о стеке Big Data, ущерб может стать очень высоким. Чтобы избежать угроз безопасности, связанных с запуском кода Python или R на узлах сегмента Greenplum, можно запускать UDF-функции в Docker-контейнере. Напомним, Docker представляет собой программную платформа разработки, тестирования и развертывания приложений, которая упаковывает их и рабочее окружение (библиотеки, системные инструменты, код и среду исполнения) в контейнеры — стандартизованные блоки. Так можно быстро разворачивать и масштабировать приложения в любой среде. Можно сказать, что Docker – это операционная система для контейнеров, которые создают виртуальное представление серверной операционной системы для приложения, аналогично виртуальным машинам с виртуальным представлением аппаратного обеспечения сервера.
Образ Docker представляет собой доступный только для чтения шаблон, который задает настройки контейнера и содержит исполняемый код вместе с определениями библиотек и зависимостей. Контейнер Docker – это запущенный (работающий) образ Docker.
Для использования контейнеризации в Greenplum есть расширение PL/Container, которое позволяет пользователям запускать функции процедурного языка внутри Docker-контейнера. Кроме того, для Python расширение PL/Container также позволяет использовать API CUDA (Compute Unified Device Architecture) с аппаратным обеспечением NVIDIA GPU в функциях процедурного языка. CUDA – это программно-аппаратная архитектура параллельных вычислений, позволяющая значительно повысить вычислительную производительность благодаря использованию графических процессоров. По сравнению с традиционными центральными процессорами графические процессоры могут обрабатывать большие объемы данных и одновременно выполнять сложные алгоритмы, что значительно повышает эффективность вычислений и возможности обработки данных. Таким образом, объединение графических процессоров с PL/Container может еще больше повысить производительность вычислений и эффективность анализа данных при выполнении обработки данных, включая машинное обучение и Deep Learning.
С помощью PL/Container пользователи могут упаковывать свои зависимости времени выполнения в образ Docker и использовать UDF в образе для анализа и обработки данных в базе данных Greenplum. Начиная с PL/Container версии 2.2.0, GPU доступен в среде выполнения PL/Container.
Чтобы воспользоваться преимуществами PL/Container в Greenplum, это расширение следует установить на всех узлах кластера. Перед этом надо установить Docker на все хост-системы Greenplum и образы Docker, которые PL/Container будет использовать для создания контейнеров для конкретных языков для запуска UDF-функций. Для запуска ML-модели с помощью PL/Container, ее следует развернуть модель на каждой машине кластера Greenplum. Для ускорения процесса можно использовать функцию монтирования файлов в PL/Container.
Для выполнения задач GPU требуется карта GPU и драйвер от вендора. Способы интеграции с Docker различаются у разных производителей. Например, при использовании видеокарты NVIDIA проще всего установить nvidia-container-runtime и nvidia-container-toolkit, которые автоматически настроят среду Docker. Для других провайдеров GPU может потребоваться смонтировать файл устройства, расположенный в каталоге /dev, например, /dev/dir для графического процессора Intel или /dev/kfd для графического процессора AMD, и установить разрешения для контейнера.
Запуск UDF внутри Docker-контейнера гарантирует, что процесс выполнения пользовательского кода происходит в отдельной среде. Операторы SQL, такие как scan, filter и project, выполняются на стороне исполнителя запросов (QE, Query Executor), а расширенный анализ данных выполняется на стороне контейнера. Код пользователя не может получить доступ к ОС или файловой системе локального хоста, поэтому не создает угроз безопасности. Более того, UDF-функции не могут подключиться обратно к базе данных Greenplum, если контейнер запущен с ограниченным сетевым доступом или без него.
Рассмотрим архитектуру и принципы работы расширения PL/Container на примере пользовательского запроса, который выбирает данные таблицы, используя все доступные сегменты, и преобразует их с помощью UDF-функции PL/Container. При первом вызове функции в контейнере сегмента исполнитель запроса на узле-координаторе запускает контейнер на этом узле сегмента. Затем он связывается с работающим контейнером для получения результатов. Контейнер может ответить с помощью интерфейса поставщика услуг (SPI, Service Provider Interface) — SQL-запроса, выполняемого контейнером для получения данных из базы. Результат возвращается исполнителю запроса. Примечательно, что контейнер, работающий в режиме ожидания, ожидает сокета (IP-адрес и порт), не потребляя никаких ресурсов ЦП. Вообще потребление памяти PL/Container зависит от объема данных, кэшированных в глобальных словарях. Соединение с контейнером закрывается путем закрытия сеанса базы данных Greenplum, который запустил контейнер, и контейнер закрывается.
В заключение отметим несколько ограничений применения PL/Container в Greenplum. Как уже было отмечено выше, потребление памяти PL/Container зависит от объема данных, кэшированных в глобальных словарях. Поэтому, если Docker-контейнер расширения превышает максимально допустимый объем памяти, он завершается, отображая предупреждение о нехватке памяти. PL/Container не ограничивает размер базового устройства Docker и размер контейнера. В некоторых случаях демон Docker управляет размером базового устройства. Базовый размер устройства по умолчанию для devicemapper в качестве драйвера хранилища Docker составляет 10 ГБ. Управлять размером этого базового устройства можно с помощью команды системной службы (демона) Docker —storage-opt option flag dm.basesize. При настройке размера базового устройства Docker это следует установить на всех хостах базы данных Greenplum.
Впрочем, даже при достаточном размере базового устройства, бывает, что демон Docker зависает с записями в журнале, которые указывают на нехватку памяти, если PL/Container работает в среде с высокой степенью параллелизма. Причем может произойти, даже если в системе достаточно свободной памяти. Разработчики отмечают, что эта проблема вызвана агрессивными требованиями к виртуальной памяти среды выполнения языка Go (golang), которая используется PL/Container, и настройкой параметра overcommit_memory для ядра Linux-сервера Greenplum, равного 2, что не допускает чрезмерного выделения памяти.
Обойти это ограничение поможет увеличение объема пространства подкачки и значения overcommit_ratio. Если проблема не устранена после внесения изменений, следует добавить больше оперативной памяти и/или уменьшить нагрузку на кластер Greenplum. Также рекомендуется использовать группы ресурсов Greenplum для управления и ограничения общих ресурсов ЦП и памяти контейнеров в средах выполнения PL/Container.
Узнайте больше подробностей про администрирование и эксплуатацию Greenplum с Arenadata DB для эффективного хранения и аналитики больших данных на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:
Источники