Профили движков Kyuubi
Обзор
Kyuubi выступает в роли унифицированного SQL-шлюза с поддержкой нескольких движков (engine): пользователи подключаются к одному эндпоинту (endpoint) Kyuubi, а администраторы могут направлять сессии к разным движкам (например, Spark3, Spark4, Flink, Trino или JDBC) с помощью профилей движков.
Обзор профиля движка
Профиль движка — это набор настроек, который может объявить администратор. Профиль позволяет объединить под одним именем такие настройки, как:
-
тип движка;
-
переменные окружения движка;
-
переменные сессии Kyuubi;
-
нативные (native) настройки движка.
Профили позволяют администраторам один раз определить настройки для конкретных движков в ADCM, вместо того чтобы требовать от пользователей передавать эти параметры в каждой строке подключения (например, версии Spark, пути SPARK_HOME или настройки подключения к базе данных). Пользователям достаточно указать имя профиля, а Kyuubi автоматически преобразует параметры найденного профиля в runtime-настройки для конкретного движка.
Профили движков обратно совместимы с уже установленными кластерами ADH. Если профили не объявлены или не применены, сессии Kyuubi работают точно так же, как и раньше, без изменений в механизмах запуска или обнаружения движков.
|
ПРИМЕЧАНИЕ
Примененные профили влияют на обнаружение и изоляцию движков, потому что имя профиля включается в имя субдомена движка. Подробная информация доступна в разделе Изоляция движков и субдомены. |
В примере ниже объявляется профиль с именем spark4-prod. Он указывает сервису Kyuubi:
-
выделить движок Spark SQL;
-
использовать определенные переменные окружения для Spark;
-
применить настройку уровня сессии;
-
передать движку Spark нативные настройки.
kyuubi.engine.profile.spark4-prod.type=SPARK_SQL
kyuubi.engine.profile.spark4-prod.env.SPARK_HOME=/usr/lib/spark4
kyuubi.engine.profile.spark4-prod.env.SPARK_CONF_DIR=/etc/spark4/conf
kyuubi.engine.profile.spark4-prod.session.engine.share.level=USER
kyuubi.engine.profile.spark4-prod.conf.spark.executor.memory=4g
kyuubi.engine.profile.spark4-prod.conf.spark.executor.cores=2
В примере ниже показан пользовательский запрос на выделение движка с профилем spark4-prod:
jdbc:hive2://kyuubi:10009/default?kyuubi.engine.profile=spark4-prod
Обзор черных списков профилей
Администраторы могут ограничивать доступ к определенным профилям для отдельных пользователей или групп пользователей. Если профиль внесен в черный список (blacklist) для пользователя или одной из групп пользователя, Kyuubi запрещает этому пользователю запускать сессии с таким профилем.
Больше информации можно узнать в разделе Ограничение использования профилей.
Настройка свойств профилей в ADCM
Чтобы добавить или изменить свойства профилей в ADCM, выполните следующие шаги:
-
Откройте конфигурацию сервиса Kyuubi, как описано в статье Настройка сервисов.
-
Перейдите на вкладку Components и нажмите на компонент Kyuubi Server.
-
В открывшейся вкладке Configuration выберите раздел конфигурации Engine profiles.
-
Добавьте свойства, связанные с профилями, с помощью поля Add property.
-
Сохраните конфигурацию.
-
Перезапустите Kyuubi или Kyuubi Server с помощью действия Restart.
В разделе конфигурации Engine profiles можно настроить следующие свойства, связанные с профилями:
-
Объявления профилей движков, например
kyuubi.engine.profile.<name>.*. Подробнее см. в разделе Объявление профилей движков. -
Профили по умолчанию:
-
Профили по умолчанию для пользователей или групп, например
<user_or_group>.kyuubi.engine.profile. Подробнее см. в разделе Профили по умолчанию для пользователей и групп. -
Профили по умолчанию для типов движков, например
kyuubi.engine.<TYPE>.profile.default. Подробнее см. в разделе Профили по умолчанию для типов движков.
-
-
Черные списки профилей, например
<user_or_group>.kyuubi.engine.profiles.blacklist. Подробнее см. в разделе Ограничение использования профилей. -
Обработка случая, когда запрошен неизвестный профиль, с помощью свойства
kyuubi.engine.profiles.unknown.strategy. Подробнее см. в разделе Стратегия для неизвестных профилей.
|
ПРИМЕЧАНИЕ
Когда в кластер ADH добавляются сервисы Spark3, Spark4, Flink или Trino, ADCM автоматически создает соответствующие локальные профили движков для Kyuubi. Подробнее см. в Обзор Kyuubi UI. Профили движков Kubernetes автоматически не создаются, их необходимо настроить вручную в ADCM. |
Объявление профилей движков
В этом разделе объясняется, как устроены свойства профилей, которые вы добавляете в ADCM в разделе конфигурации Engine profiles.
Свойства профилей — пары ключ/значение в формате <key>:<value>. Все ключи объявления профиля начинаются с общего префикса:
kyuubi.engine.profile.<name>.<bucket>
где:
-
<name>— идентификатор профиля. Он не должен конфликтовать с названиями бакетов (bucket), перечисленными в таблице ниже; -
<bucket>— ключевое слово, которое определяет, как Kyuubi интерпретирует, маршрутизирует и применяет настройку. Поддерживаемые бакеты:type,env,sessionиconf. Полный формат ключа зависит от выбранного бакета и описан в таблице ниже.
| Бакет | Полный синтаксис ключа | Описание и пример |
|---|---|---|
type |
kyuubi.engine.profile.<name>.type |
Тип движка. Для профиля с именем
|
env |
kyuubi.engine.profile.<name>.env.<VAR> |
Переменная окружения движка. Для профиля с именем
|
session |
kyuubi.engine.profile.<name>.session.<rest> |
Настройка сессии Kyuubi. Для профиля с именем
|
conf |
kyuubi.engine.profile.<name>.conf.<rest> |
Нативная настройка движка. Для профиля с именем
|
Ключи вида kyuubi.engine.profile.<name>.* описывают профиль только на стороне Kyuubi Server. Поэтому сами эти ключи не передаются в подпроцессы движков. Вместо этого Kyuubi разбирает объявление профиля, выбирает из него значения бакетов env, session и conf, а затем преобразует их в runtime-настройки, которые уже применяются при запуске движка.
Например, профиль JDBC может содержать настройки подключения, включая пароль:
kyuubi.engine.profile.pg.type=JDBC
kyuubi.engine.profile.pg.conf.kyuubi.engine.jdbc.type=postgresql
kyuubi.engine.profile.pg.conf.kyuubi.engine.jdbc.driver.class=org.postgresql.Driver
kyuubi.engine.profile.pg.conf.kyuubi.engine.jdbc.connection.url=jdbc:postgresql://postgres.example.com:5432/analytics
kyuubi.engine.profile.pg.conf.kyuubi.engine.jdbc.connection.user=analytics_reader
kyuubi.engine.profile.pg.conf.kyuubi.engine.jdbc.connection.password=<password>
В этом примере kyuubi.engine.profile.pg.conf.kyuubi.engine.jdbc.connection.password становится kyuubi.engine.jdbc.connection.password для движка. Движок по-прежнему получает пароль, но не получает полное серверное объявление профиля в виде исходных свойств kyuubi.engine.profile.pg.*.
Следующие примеры демонстрируют, как объявлять различные профили движков в ADCM.
Профили Spark
Пример профиля для локальной установки Spark3, который задает количество памяти по умолчанию:
kyuubi.engine.profile.spark3.type=SPARK_SQL
kyuubi.engine.profile.spark3.env.SPARK_HOME=/usr/lib/spark3
kyuubi.engine.profile.spark3.env.SPARK_CONF_DIR=/etc/spark3/conf
kyuubi.engine.profile.spark3.conf.spark.executor.memory=2g
Пример профиля для локальной установки Spark4, который задает количество памяти по умолчанию:
kyuubi.engine.profile.spark4.type=SPARK_SQL
kyuubi.engine.profile.spark4.env.SPARK_HOME=/usr/lib/spark4
kyuubi.engine.profile.spark4.env.SPARK_CONF_DIR=/etc/spark4/conf
kyuubi.engine.profile.spark4.conf.spark.executor.memory=2g
Следующий пример настраивает профиль для запуска движков Spark4 в Kubernetes:
kyuubi.engine.profile.spark4-k8s.type=SPARK_SQL
kyuubi.engine.profile.spark4-k8s.conf.spark.master=k8s://https://<k8s-apiserver-host>:<k8s-apiserver-port>
kyuubi.engine.profile.spark4-k8s.conf.spark.kubernetes.container.image=<spark4-image>
kyuubi.engine.profile.spark4-k8s.conf.spark.kubernetes.namespace=<namespace>
kyuubi.engine.profile.spark4-k8s.conf.spark.executor.instances=2
kyuubi.engine.profile.spark4-k8s.conf.spark.executor.memory=1g
Клиенты могут явно запросить этот профиль в строке подключения:
jdbc:hive2://kyuubi:10009/default?kyuubi.engine.profile=spark4-k8s
Профиль Trino
Пример профиля для маршрутизации запросов в определенный кластер Trino:
kyuubi.engine.profile.trino-prod.type=TRINO
kyuubi.engine.profile.trino-prod.conf.kyuubi.engine.trino.connection.url=http://trino-coordinator.example.com:8080
kyuubi.engine.profile.trino-prod.conf.kyuubi.engine.trino.connection.catalog=system
kyuubi.engine.profile.trino-prod.conf.kyuubi.engine.trino.connection.user=analytics_reader
kyuubi.engine.profile.trino-prod.conf.kyuubi.engine.trino.connection.password=<password>
Пример профиля для подключения к координатору Trino, развернутому в Kubernetes и доступному через внешний IP-адрес:
kyuubi.engine.profile.trino-k8s.type=TRINO
kyuubi.engine.profile.trino-k8s.conf.kyuubi.engine.trino.connection.url=jdbc:trino://<external-ip>:8080
kyuubi.engine.profile.trino-k8s.conf.kyuubi.engine.trino.connection.catalog=adh-iceberg
Профиль Flink
Пример профиля для запуска приложений движка Flink:
kyuubi.engine.profile.flink-test.type=FLINK_SQL
kyuubi.engine.profile.flink-test.conf.flink.execution.target=remote
kyuubi.engine.profile.flink-test.conf.flink.app.name=test_app
kyuubi.engine.profile.flink-test.conf.kyuubi.engine.flink.doAs.enabled=false
Назначение профилей по умолчанию
Вы можете назначать профили по умолчанию в ADCM:
-
для конкретных пользователей или групп;
-
глобально для каждого типа движка.
Профили по умолчанию для пользователей и групп
Вы можете задавать профили по умолчанию для отдельных пользователей или групп пользователей. Kyuubi использует эти профили по умолчанию, если в сессии профиль явно не указан:
___<user_name>___.kyuubi.engine.profile=<profile_name>
___<group_name>___.kyuubi.engine.profile=<profile_name>
Пример:
___alice___.kyuubi.engine.profile=trino-prod
___analysts___.kyuubi.engine.profile=spark4-prod
Профили по умолчанию для типов движков
Вы можете задать профиль по умолчанию для типа движка (engine type). Kyuubi использует его, если в сессии не указан профиль и не найден подходящий профиль по умолчанию для пользователя или группы:
kyuubi.engine.<TYPE>.profile.default=<profile_name>
где <TYPE> — допустимый тип движка, например SPARK_SQL, TRINO, FLINK_SQL или JDBC.
Пример:
kyuubi.engine.SPARK_SQL.profile.default=spark3-prod
Ограничение использования профилей
Вы можете настроить черные списки (blacklist) в ADCM, чтобы запретить выбранные профили для отдельных пользователей или групп пользователей.
___<user_name>___.kyuubi.engine.profiles.blacklist=<profile1>,<profile2>
___<group_name>___.kyuubi.engine.profiles.blacklist=<profile1>,<profile2>
Черные списки работают по следующим правилам:
-
Ограничения для пользователя сессии и всех групп пользователя объединяются. Профиль запрещен, если он присутствует в любом подходящем черном списке.
-
Если пользователь явно запрашивает профиль из черного списка в строке подключения с помощью
kyuubi.engine.profile=<profile_name>, Kyuubi отклоняет сессию. -
Если профиль из черного списка выбран неявно — например, как профиль по умолчанию для пользователя, группы или типа движка — Kyuubi пропускает его. Затем Kyuubi продолжает поиск в следующем источнике с более низким приоритетом. Подробнее см. в разделе Порядок выбора профилей.
Пример:
___analysts___.kyuubi.engine.profiles.blacklist=spark4-prod,trino-k8s
___bob___.kyuubi.engine.profiles.blacklist=flink-test
Как выбираются профили
Порядок выбора профилей
Когда открывается новая сессия Kyuubi, Kyuubi Server выбирает для нее не более одного профиля. Kyuubi проверяет следующие источники в строгом порядке приоритета и останавливается на первом источнике, который возвращает имя профиля:
-
Явный параметр сессии
Клиент явно запрашивает профиль по имени, например, с помощьюkyuubi.engine.profile=<name>в строке подключения JDBC. Если запрошенный профиль внесен в черный список для пользователя, сессия сразу завершается с ошибкой. -
Профиль по умолчанию для пользователя или группы
Если профиль не запрошен явно, Kyuubi ищет профиль по умолчанию, подходящий для пользователя или его группы, с помощью свойства<principal>.kyuubi.engine.profile. Сначала проверяется пользователь сессии, затем группы пользователя. Если найденный профиль по умолчанию внесен в черный список для этого пользователя, Kyuubi пропускает его и переходит к следующему профилю по умолчанию с более низким приоритетом. -
Профиль по умолчанию для типа движка
Если подходящие профили по умолчанию для пользователя или группы не найдены, Kyuubi ищет профиль по умолчанию для типа движка с помощью свойстваkyuubi.engine.<TYPE>.profile.default, где<TYPE>— выбранный тип движка для сессии. Если этот профиль внесен в черный список для текущего пользователя, он игнорируется и профиль не применяется. -
Без профиля
Если не удалось выбрать имя профиля из перечисленных выше источников, профиль не применяется. Сессия ведет себя так же, как в развертывании Kyuubi без профилей движков.
Если алгоритм выбора профиля возвращает имя профиля, которое не было объявлено, Kyuubi обрабатывает этот случай, как описано в разделе Стратегия для неизвестных профилей.
Итоговая конфигурация сессии
Любой параметр конфигурации, явно переданный клиентом в строке подключения, переопределяет соответствующее значение, заданное в профиле движка.
Когда Kyuubi формирует итоговую конфигурацию сессии, он применяет свойства от самого низкого к самому высокому приоритету:
-
Базовая конфигурация сессии (значения по умолчанию для Kyuubi Server и значения конфигурации по умолчанию для пользователя или группы).
-
Параметры, которые заданы в выбранном профиле.
-
Параметры, которые явно запросил клиент.
Изоляция движков и субдомены
Движки, запущенные с разными профилями, изолированы друг от друга: они никогда не используют один и тот же экземпляр движка и не переиспользуют runtime-ресурсы, созданные для другого профиля. Это правило действует даже в случаях, когда сессии используют один и тот же тип общего доступа к движку (share level), например USER, GROUP или SERVER.
Например, две сессии, открытые одним пользователем с разными профилями, запускают отдельные процессы движков.
Без профилей субдомен обычно основан только на идентификаторе типа общего доступа, например имени пользователя или имени группы. Если профили применены, Kyuubi строит субдомен, соединяя имя профиля и исходный субдомен символом подчеркивания: <profile>_<subdomain>. В таблице ниже приведен пример.
| Тип общего доступа | Субдомен без профиля | Субдомен с профилем spark4 |
|---|---|---|
USER |
alice |
spark4_alice |
GROUP |
analytics |
spark4_analytics |
Если профиль не применяется, субдомен остается без изменений.
|
ВАЖНО
Если профиль применен, то клиентские приложения, команды CLI и запросы REST API, которые используют субдомен движка, должны использовать формат Например, для движков, запущенных с профилем |
Валидация и обработка ошибок
Fail-fast-валидация при запуске
Профили движков являются статическими конфигурациями, которые Kyuubi Server считывает только один раз во время запуска. Kyuubi валидирует их по принципу fail-fast: если какой-либо профиль некорректен, Kyuubi Server немедленно останавливается при запуске.
Объявление профиля считается невалидным в следующих случаях:
-
Не удается распознать тип движка, объявленный в бакете
type. Поддерживаемые типы движков:-
SPARK_SQL -
FLINK_SQL -
TRINO -
JDBC
-
-
В объявлении профиля используется неизвестный бакет: любой, кроме
type,env,sessionилиconf. -
Бакет объявлен в неправильном формате, например бакет
typeсодержит подключ (subkey), или после бакетаenvне указано имя переменной окружения.
Стратегия для неизвестных профилей
Если алгоритм выбора профиля возвращает незадекларированное имя профиля, то Kyuubi обрабатывает такую ситуацию в соответствии со свойством kyuubi.engine.profiles.unknown.strategy:
-
FAIL(по умолчанию) — Kyuubi немедленно прерывает попытку подключения и возвращает клиенту сообщение об ошибке со списком всех доступных имен профилей. -
LOG— на стороне Kyuubi Server записывается warning-сообщение, и инициализация сессии продолжается без применения профиля.
Просмотр профилей движков
В web-интерфейсе Kyuubi можно работать с профилями движков, а именно:
-
просматривать движки, сгруппированные по профилю движка;
-
видеть неактивные профили, у которых нет запущенных экземпляров движков;
-
обновлять список профилей;
-
завершать (kill) работающие движки, связанные с профилем.
Узнать больше можно в статье Обзор Kyuubi UI.
Та же информация о профилях доступна через эндпоинт (endpoint) REST API:
$ curl -X GET http://<kyuubi_host>:<kyuubi_port>/api/v1/admin/engine/profile