[Документация Yandex Cloud](../../index.md) > [Yandex Managed Service for Trino](../index.md) > [Пошаговые инструкции](index.md) > Кластеры > Управление ресурсными группами

# Управление ресурсными группами в Managed Service for Trino

В Managed Service for Trino вы можете управлять конфигурацией [ресурсных групп](../concepts/resource-groups.md):
* [получить информацию о текущей конфигурации](#get),
* [задать конфигурацию при создании кластера](#set-at-create),
* [задать или изменить конфигурацию для существующего кластера](#set-at-update),
* [удалить конфигурацию](#delete).

## Получить информацию о конфигурации ресурсных групп {#get}

{% list tabs group=instructions %}

- Консоль управления {#console}

  1. В [консоли управления](https://kz.console.yandex.cloud) перейдите в нужный каталог.
  1. Перейдите в сервис **Managed Service for&nbsp;Trino**.
  1. Нажмите на имя нужного кластера.
  1. Перейдите в блок **Управление ресурсами**.

- CLI {#cli}

  Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), [установите и инициализируйте его](../../cli/quickstart.md#install).

  По умолчанию используется каталог, указанный при [создании](../../cli/operations/profile/profile-create.md) профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду `yc config set folder-id <идентификатор_каталога>`. Также для любой команды вы можете указать другой каталог с помощью параметров `--folder-name` или `--folder-id`. Если вы обращаетесь к ресурсу по имени, поиск будет выполнен в каталоге по умолчанию. Если вы обращаетесь к ресурсу по идентификатору, поиск будет выполнен глобально — во всех каталогах с учетом прав доступа.

  Чтобы получить описание ресурсных групп и правил маршрутизации в кластере Managed Service for Trino, выполните команду:

  ```bash
  yc managed-trino cluster get-resource-groups <имя_или_идентификатор_кластера>
  ```

  Идентификатор и имя кластера можно запросить со [списком кластеров в каталоге](cluster-list.md#list-clusters).

- REST API {#api}

    1. [Получите IAM-токен для аутентификации в API](../api-ref/authentication.md) и поместите токен в переменную среды окружения:

        ```bash
        export IAM_TOKEN="<IAM-токен>"
        ```

    1. Воспользуйтесь методом [Cluster.Get](../api-ref/Cluster/get.md) и выполните запрос, например, с помощью [cURL](https://curl.se/):

        ```bash
        curl \
            --request GET \
            --header "Authorization: Bearer $IAM_TOKEN" \
            --url 'https://trino.api.cloud.yandex.net/managed-trino/v1/clusters/<идентификатор_кластера>'
        ```

        Идентификатор кластера можно запросить со [списком кластеров в каталоге](#list-clusters).

    1. Описание ресурсных групп и правил маршрутизации в кластере Managed Service for Trino содержится в [ответе сервера](../api-ref/Cluster/get.md#yandex.cloud.trino.v1.Cluster) в поле `resourceGroups`.

- gRPC API {#grpc-api}

    1. [Получите IAM-токен для аутентификации в API](../api-ref/authentication.md) и поместите токен в переменную среды окружения:

        ```bash
        export IAM_TOKEN="<IAM-токен>"
        ```

    1. Клонируйте репозиторий [cloudapi](https://github.com/yandex-cloud/cloudapi):
       
       ```bash
       cd ~/ && git clone --depth=1 https://github.com/yandex-cloud/cloudapi
       ```
       
       Далее предполагается, что содержимое репозитория находится в директории `~/cloudapi/`.

    1. Воспользуйтесь вызовом [ClusterService.Get](../api-ref/grpc/Cluster/get.md) и выполните запрос, например с помощью [gRPCurl](https://github.com/fullstorydev/grpcurl):

        ```bash
        grpcurl \
            -format json \
            -import-path ~/cloudapi/ \
            -import-path ~/cloudapi/third_party/googleapis/ \
            -proto ~/cloudapi/yandex/cloud/trino/v1/cluster_service.proto \
            -rpc-header "Authorization: Bearer $IAM_TOKEN" \
            -d '{
                    "cluster_id": "<идентификатор_кластера>"
                }' \
            trino.api.cloud.yandex.net:443 \
            yandex.cloud.trino.v1.ClusterService.Get
        ```

        Идентификатор кластера можно запросить со [списком кластеров в каталоге](#list-clusters).

    1. Описание ресурсных групп и правил маршрутизации в кластере Managed Service for Trino содержится в [ответе сервера](../api-ref/grpc/Cluster/get.md#yandex.cloud.trino.v1.Cluster) в поле `resource_groups`.

{% endlist %}

## Задать конфигурацию ресурсных групп при создании кластера {#set-at-create}

{% list tabs group=instructions %}

- Консоль управления {#console}

  1. В [консоли управления](https://kz.console.yandex.cloud) выберите каталог, в котором нужно создать кластер Managed Service for Trino.
  1. Перейдите в сервис **Managed Service for&nbsp;Trino**.
  1. Нажмите кнопку **Создать кластер** и задайте параметры кластера.
  1. Перейдите в блок **Управление ресурсами**.
  1. В поле **CPU quota period** задайте период расчета квоты CPU для ресурсных групп.
  1. Нажмите кнопку **Добавить группу** и задайте параметры ресурсной группы:

     1. (Опционально) Выберите родительскую группу.
     1. Задайте имя ресурсной группы.
     
        Имя группы может представлять собой шаблон, использующий подстановки переменных в формате `${<имя_переменной>}`. Имя-шаблон может содержать следующие виды переменных:
        * Встроенные: `USER` — имя пользователя, `SOURCE` — источник запроса.
        * Пользовательские: объявляются в параметрах правил маршрутизации **Пользователь** и **Источник**.
     
        При маршрутизации запросов Managed Service for Trino будет создавать экземпляры группы с динамически сформированными именами.
     
     1. В поле **Max queued** задайте максимальное число запросов в очереди (должно быть больше `1`). При достижении этого лимита новые запросы будут отклонены с ошибкой.
     1. (Опционально) В поле **Soft concurrency limit** задайте мягкий лимит на число запущенных запросов. При достижении этого лимита новые запросы будут запускаться в группе, только если соседние группы не могут принимать запросы или превысили свои мягкие лимиты. В противном случае новые запросы будут поставлены в очередь.
     1. В поле **Hard concurrency limit** задайте максимальное число запущенных запросов (должно быть больше `1`). При достижении этого лимита новые запросы будут поставлены в очередь.
     1. (Опционально) В поле **Soft memory limit, %** задайте максимальный процент доступной памяти, который может использоваться группой. При достижении этого лимита новые запросы будут поставлены в очередь.
     1. (Опционально) В поле **Soft CPU limit** задайте мягкий лимит процессорного времени. При достижении этого лимита максимальное число запущенных запросов будет снижено до окончания текущего периода расчета квоты CPU. Не может быть больше, чем **Hard CPU limit**. Чтобы задать **Soft CPU limit**, нужно также задать **CPU quota period**.
     1. (Опционально) В поле **Hard CPU limit** задайте жесткий лимит процессорного времени. При достижении этого лимита новые запросы будут поставлены в очередь. Чтобы задать **Hard CPU limit**, нужно также задать **CPU quota period**.
     1. (Опционально) В поле **Scheduling policy** задайте [политику планирования запросов](../concepts/resource-groups.md#policy). Возможные значения: `fair`, `weighted`, `weighted_fair`, `query_priority`. Значение по умолчанию — `none` (действует политика `fair`).
     1. (Опционально) В поле **Scheduling weight** задайте вес группы, используемый в политиках планирования `weighted` и `weighted_fair`.
     
     Подробнее о дереве групп в разделе [Ресурсные группы в Managed Service for Trino](../concepts/resource-groups.md).

  1. (Опционально) Добавьте другие ресурсные группы аналогичным образом.
  1. Нажмите кнопку **Добавить правило** и задайте параметры правила:

     1. (Опционально) В поле **Пользователь** задайте имя пользователя, отправившего запрос, или регулярное выражение Java. Правило срабатывает, если имя пользователя соответствует регулярному выражению. Если параметр не указан, правило срабатывает для запросов от любых пользователей.
     1. (Опционально) В поле **Группа** задайте имя группы пользователя, отправившего запрос, или регулярное выражение Java. Правило срабатывает, если имя группы пользователя соответствует регулярному выражению. Если параметр не указан, правило срабатывает для запросов пользователей любых групп.
     1. (Опционально) В поле **Тип запроса** выберите тип запроса. Возможные значения:
        * `SELECT` — запросы `SELECT`.
        * `EXPLAIN` — запросы `EXPLAIN`, кроме `EXPLAIN ANALYZE`.
        * `DESCRIBE` — запросы `DESCRIBE`, `DESCRIBE INPUT` и `DESCRIBE OUTPUT`, а также запросы `SHOW` (например, `SHOW CATALOGS` или `SHOW SCHEMAS`).
        * `INSERT` — запросы `INSERT`, `CREATE TABLE AS` и `REFRESH MATERIALIZED VIEW`.
        * `MERGE` — запросы `MERGE`.
        * `DELETE` — запросы `DELETE`.
        * `ANALYZE` — запросы `ANALYZE`.
        * `DATA_DEFINITION` — запросы `CREATE`, `ALTER` и `DROP` для схем, таблиц, представлений и материализованных представлений, а также запросы управления подготовленными выражениями, правами доступа, сессиями и транзакциями.
        * `ALTER_TABLE_EXECUTE` — запросы вида `ALTER TABLE ... EXECUTE`.
     
     1. (Опционально) В поле **Источник** задайте имя источника запроса или регулярное выражение Java. Правило срабатывает, если имя источника запроса соответствует регулярному выражению. Если параметр не указан, правило срабатывает для запросов из любых источников.
     1. В поле **Ресурсная группа** выберите ресурсную группу, в которой будет запущен запрос. Целевая группа не может иметь дочерних групп.
     1. (Опционально) В поле **Теги** укажите теги через запятую. Правило срабатывает, только если запрос содержит все указанные теги. Если параметр не указан, правило срабатывает для запросов с любыми тегами.
     
     {% note warning %}
     
     Запрос, не соответствующий ни одному заданному правилу, отклоняется с ошибкой. Чтобы этого не происходило, добавьте в конец описания правило без ограничивающих условий, содержащее только параметр **Ресурсная группа**.
     
     {% endnote %}
     
     Подробнее о правилах маршрутизации в разделе [Ресурсные группы в Managed Service for Trino](../concepts/resource-groups.md).

  1. (Опционально) Добавьте другие правила маршрутизации аналогичным образом.
  1. Нажмите кнопку **Создать**.

- CLI {#cli}

  Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), [установите и инициализируйте его](../../cli/quickstart.md#install).

  По умолчанию используется каталог, указанный при [создании](../../cli/operations/profile/profile-create.md) профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду `yc config set folder-id <идентификатор_каталога>`. Также для любой команды вы можете указать другой каталог с помощью параметров `--folder-name` или `--folder-id`. Если вы обращаетесь к ресурсу по имени, поиск будет выполнен в каталоге по умолчанию. Если вы обращаетесь к ресурсу по идентификатору, поиск будет выполнен глобально — во всех каталогах с учетом прав доступа.

  Чтобы задать конфигурацию ресурсных групп:

  1. Создайте файл с описанием ресурсных групп и правил маршрутизации в формате JSON или YAML. Ниже представлен пример YAML-файла `resource-groups.yaml`.

     ```yaml
     rootGroups:
       # Корневая ресурсная группа 1
       - name: "<имя_ресурсной_группы>"
         softMemoryLimit: "<лимит_использования_памяти>"
         softConcurrencyLimit: <мягкий_лимит_числа_запущенных_запросов>
         hardConcurrencyLimit: <жесткий_лимит_числа_запущенных_запросов>
         softCpuLimit: <мягкий_лимит_процессорного_времени>
         hardCpuLimit: <жесткий_лимит_процессорного_времени>
         maxQueued: <лимит_числа_запросов_в_очереди>
         schedulingPolicy: "<политика_планирования_запросов>"
         schedulingWeight: <вес_группы>
         subGroups:
           # Дочерняя ресурсная группа 1
           - name: "<имя_ресурсной_группы>"
             ...
             subGroups: [<список_дочерних_групп_следующих_уровней>]
           # Дочерняя ресурсная группа 2
           - name: "<имя_ресурсной_группы>"
             ...
             subGroups: [<список_дочерних_групп_следующих_уровней>]
           ...
           # Дочерняя ресурсная группа N
           - name: "<имя_ресурсной_группы>"
             ...
             subGroups: [<список_дочерних_групп_следующих_уровней>]
       # Корневая ресурсная группа 2
       - name: "<имя_ресурсной_группы_2>"
         ...
       # Корневая ресурсная группа N
       - name: "<имя_ресурсной_группы_N>"
         ...
     selectors:
       # Правило маршрутизации 1
       - user: "<регулярное_выражение_для_имен_пользователей>"
         userGroup: "<регулярное_выражение_для_групп_пользователей>"
         queryType: "<тип_запроса>"
         source: "<регулярное_выражение_для_источников_запросов>"
         clientTags: ["<список_тегов>"]
         group: "<имя_ресурсной_группы>"
       # Правило маршрутизации 2
       - ...
       ...
       # Правило маршрутизации N
       - ...
     cpuQuotaPeriod: "<период_расчета_квоты_CPU>"
     ```

     Где:

     * `rootGroups` — описание дерева ресурсных групп. Параметры `name`, `hardConcurrencyLimit` и `maxQueued` являются обязательными.
       * `name` — имя группы.
     
         Имя группы может представлять собой шаблон, использующий подстановки переменных в формате `${<имя_переменной>}`. Имя-шаблон может содержать следующие виды переменных:
         * Встроенные: `USER` — имя пользователя, `SOURCE` — источник запроса.
         * Пользовательские: объявляются в параметрах правил маршрутизации `user`, `userGroup` и `source`.
     
         При маршрутизации запросов Managed Service for Trino будет создавать экземпляры группы с динамически сформированными именами.
     
       * `softMemoryLimit` — максимальный объем доступной памяти, который может использоваться группой. При достижении этого лимита новые запросы будут поставлены в очередь. Значение `softMemoryLimit` может задаваться одним из способов:
         * В процентах от общего объема доступной памяти, например `10%`.
         * Как абсолютное значение объема памяти, например `1GB`. Можно использовать один из следующих суффиксов: `B`, `kB`, `MB`, `GB`, `TB`, `PB`.
       * `softConcurrencyLimit` — мягкий лимит на число запущенных запросов. При достижении этого лимита новые запросы будут запускаться в группе, только если соседние группы не могут принимать запросы или превысили свои мягкие лимиты. В противном случае новые запросы будут поставлены в очередь.
       * `hardConcurrencyLimit` — максимальное число запущенных запросов. При достижении этого лимита новые запросы будут поставлены в очередь.
       * `softCpuLimit` — мягкий лимит процессорного времени. При достижении этого лимита значение `hardConcurrencyLimit` будет снижено до окончания текущего периода расчета квоты CPU. Значение `softCpuLimit` не может быть больше, чем `hardCpuLimit`.
       * `hardCpuLimit` — жесткий лимит процессорного времени. При достижении этого лимита новые запросы будут поставлены в очередь.
     
       {% note info %}
     
       Если задан хотя бы один из параметров — `softCpuLimit` или `hardCpuLimit`, задайте также параметр `cpuQuotaPeriod`.
     
       {% endnote %}
     
       * `maxQueued` — максимальное число запросов в очереди. При достижении этого лимита новые запросы будут отклонены с ошибкой.
       * `schedulingPolicy` — [политика планирования запросов](../concepts/resource-groups.md#policy). Возможные значения:
         * `FAIR`
         * `WEIGHTED`
         * `WEIGHTED_FAIR`
         * `QUERY_PRIORITY`
     
         Если параметр не указан, действует политика `FAIR`.
     
       * `schedulingWeight` — вес группы, используемый в политиках планирования `WEIGHTED` и `WEIGHTED_FAIR`.
     
         Если параметр не указан, вес группы равен `1`.
     
       * `subGroups` — описания дочерних групп.
     
     * `selectors` — описание правил маршрутизации. Параметр `group` является обязательным.
       * `user` — имя пользователя, отправившего запрос, или регулярное выражение Java. Правило срабатывает, если имя пользователя соответствует регулярному выражению. Если параметр не указан, правило срабатывает для запросов любых пользователей.
       * `userGroup` — имя группы пользователя, отправившего запрос, или регулярное выражение Java для групп пользователей. Правило срабатывает, если имя группы пользователя соответствует регулярному выражению. Если параметр не указан, правило срабатывает для запросов пользователей любых групп.
       * `queryType` — тип запроса. Возможные значения:
         * `SELECT` — запросы `SELECT`.
         * `EXPLAIN` — запросы `EXPLAIN`, кроме `EXPLAIN ANALYZE`.
         * `DESCRIBE` — запросы `DESCRIBE`, `DESCRIBE INPUT` и `DESCRIBE OUTPUT`, а также запросы `SHOW` (например, `SHOW CATALOGS` или `SHOW SCHEMAS`).
         * `INSERT` — запросы `INSERT`, `CREATE TABLE AS` и `REFRESH MATERIALIZED VIEW`.
         * `MERGE` — запросы `MERGE`.
         * `DELETE` — запросы `DELETE`.
         * `ANALYZE` — запросы `ANALYZE`.
         * `DATA_DEFINITION` — запросы `CREATE`, `ALTER` и `DROP` для схем, таблиц, представлений и материализованных представлений, а также запросы управления подготовленными выражениями, правами доступа, сессиями и транзакциями.
         * `ALTER_TABLE_EXECUTE` — запросы вида `ALTER TABLE ... EXECUTE`.
     
       * `source` — имя источника запроса или регулярное выражение Java. Правило срабатывает, если имя источника запроса соответствует регулярному выражению. Если параметр не указан, правило срабатывает для запросов из любых источников.
       * `clientTags` — список тегов. Правило срабатывает, только если запрос содержит все указанные теги. Если параметр не указан, правило срабатывает для запросов с любыми тегами.
       * `group` — полное имя целевой ресурсной группы. Включает имена всех ее родительских групп, разделенных точками, начиная с корневой группы. В имени группы могут использоваться подстановки переменных в формате `${<имя_переменной>}`. Целевая группа не может иметь дочерних групп.
     
       {% note warning %}
     
       Запрос, не соответствующий ни одному заданному правилу, отклоняется с ошибкой. Чтобы этого не происходило, добавьте в конец описания правило без ограничивающих условий, содержащее только параметр `group`.
     
       {% endnote %}
     
     * `cpuQuotaPeriod` — период расчета квоты CPU для ресурсных групп. Задается как целое число секунд, минут или часов, например `140s`, `30m` или `1h`.
     
     Подробнее о дереве групп и правилах маршрутизации в разделе [Ресурсные группы в Managed Service for Trino](../concepts/resource-groups.md).

  1. Посмотрите описание команды CLI для создания кластера:

     ```bash
     yc managed-trino cluster create --help
     ```

  1. Выполните команду:

     ```bash
     yc managed-trino cluster create \
       ...
       --resource-groups-from-file resource-groups.yaml
     ```

     Доступные параметры кластера и их описания представлены в [инструкции](cluster-create.md#create-cluster).

- Terraform {#tf}

  1. Создайте конфигурационный файл Terraform с [планом инфраструктуры](cluster-create.md).

  1. Добавьте в описание кластера блок `resource_groups`:

     ```hcl
     resource_groups = jsonencode(
       {
         "rootGroups" : [
           # Корневая ресурсная группа 1
           {
             "name" : "<имя_ресурсной_группы>",
             "softMemoryLimit" : "<лимит_использования_памяти>",
             "softConcurrencyLimit" : <мягкий_лимит_числа_запущенных_запросов>,
             "hardConcurrencyLimit" : <жесткий_лимит_числа_запущенных_запросов>,
             "softCpuLimit" : <мягкий_лимит_процессорного_времени>,
             "hardCpuLimit" : <жесткий_лимит_процессорного_времени>,
             "maxQueued" : <лимит_числа_запросов_в_очереди>,
             "schedulingPolicy" : "<политика_планирования_запросов>",
             "schedulingWeight" : <вес_группы>,
             "subGroups" : [
               # Дочерняя ресурсная группа 1
               {
                 ...
                 "subGroups" : [<список_дочерних_групп_следующих уровней>]
               },
               # Дочерняя ресурсная группа 2
               {
                 ...
                 "subGroups" : [<список_дочерних_групп_следующих уровней>]
               },
               ...
               # Дочерняя ресурсная группа N
               {
                 ...
                 "subGroups" : [<список_дочерних_групп_следующих уровней>]
               }
             ]
           },
           # Корневая ресурсная группа 2
           {
             ... 
           },
           ...
           # Корневая ресурсная группа N
           {
             ... 
           }
         ],
         "selectors" : [
           # Правило маршрутизации 1
           {
             "user" : "<регулярное_выражение_для_имен_пользователей>",
             "userGroup" : "<регулярное_выражение_для_групп_пользователей>",
             "queryType" : "<тип_запроса>",
             "source" : "<регулярное_выражение_для_источников_запросов>",
             "clientTags" : ["<список_тегов>"],
             "group" : "<имя_ресурсной_группы>"
           },
           # Правило маршрутизации 2
           {
             ... 
           },
           ...
           # Правило маршрутизации N
           {
             ... 
           }
         ],
         "cpuQuotaPeriod" : "<период_расчета_квоты_CPU>"
       }
     )
     ```

     Где:

     * `rootGroups` — описание дерева ресурсных групп. Параметры `name`, `hardConcurrencyLimit` и `maxQueued` являются обязательными.
       * `name` — имя группы.
     
         Имя группы может представлять собой шаблон, использующий подстановки переменных в формате `${<имя_переменной>}`. Имя-шаблон может содержать следующие виды переменных:
         * Встроенные: `USER` — имя пользователя, `SOURCE` — источник запроса.
         * Пользовательские: объявляются в параметрах правил маршрутизации `user`, `userGroup` и `source`.
     
         При маршрутизации запросов Managed Service for Trino будет создавать экземпляры группы с динамически сформированными именами.
     
       * `softMemoryLimit` — максимальный объем доступной памяти, который может использоваться группой. При достижении этого лимита новые запросы будут поставлены в очередь. Значение `softMemoryLimit` может задаваться одним из способов:
         * В процентах от общего объема доступной памяти, например `10%`.
         * Как абсолютное значение объема памяти, например `1GB`. Можно использовать один из следующих суффиксов: `B`, `kB`, `MB`, `GB`, `TB`, `PB`.
       * `softConcurrencyLimit` — мягкий лимит на число запущенных запросов. При достижении этого лимита новые запросы будут запускаться в группе, только если соседние группы не могут принимать запросы или превысили свои мягкие лимиты. В противном случае новые запросы будут поставлены в очередь.
       * `hardConcurrencyLimit` — максимальное число запущенных запросов. При достижении этого лимита новые запросы будут поставлены в очередь.
       * `softCpuLimit` — мягкий лимит процессорного времени. При достижении этого лимита значение `hardConcurrencyLimit` будет снижено до окончания текущего периода расчета квоты CPU. Значение `softCpuLimit` не может быть больше, чем `hardCpuLimit`.
       * `hardCpuLimit` — жесткий лимит процессорного времени. При достижении этого лимита новые запросы будут поставлены в очередь.
     
       {% note info %}
     
       Если задан хотя бы один из параметров — `softCpuLimit` или `hardCpuLimit`, задайте также параметр `cpuQuotaPeriod`.
     
       {% endnote %}
     
       * `maxQueued` — максимальное число запросов в очереди. При достижении этого лимита новые запросы будут отклонены с ошибкой.
       * `schedulingPolicy` — [политика планирования запросов](../concepts/resource-groups.md#policy). Возможные значения:
         * `FAIR`
         * `WEIGHTED`
         * `WEIGHTED_FAIR`
         * `QUERY_PRIORITY`
     
         Если параметр не указан, действует политика `FAIR`.
     
       * `schedulingWeight` — вес группы, используемый в политиках планирования `WEIGHTED` и `WEIGHTED_FAIR`.
     
         Если параметр не указан, вес группы равен `1`.
     
       * `subGroups` — описания дочерних групп.
     
     * `selectors` — описание правил маршрутизации. Параметр `group` является обязательным.
       * `user` — имя пользователя, отправившего запрос, или регулярное выражение Java. Правило срабатывает, если имя пользователя соответствует регулярному выражению. Если параметр не указан, правило срабатывает для запросов любых пользователей.
       * `userGroup` — имя группы пользователя, отправившего запрос, или регулярное выражение Java для групп пользователей. Правило срабатывает, если имя группы пользователя соответствует регулярному выражению. Если параметр не указан, правило срабатывает для запросов пользователей любых групп.
       * `queryType` — тип запроса. Возможные значения:
         * `SELECT` — запросы `SELECT`.
         * `EXPLAIN` — запросы `EXPLAIN`, кроме `EXPLAIN ANALYZE`.
         * `DESCRIBE` — запросы `DESCRIBE`, `DESCRIBE INPUT` и `DESCRIBE OUTPUT`, а также запросы `SHOW` (например, `SHOW CATALOGS` или `SHOW SCHEMAS`).
         * `INSERT` — запросы `INSERT`, `CREATE TABLE AS` и `REFRESH MATERIALIZED VIEW`.
         * `MERGE` — запросы `MERGE`.
         * `DELETE` — запросы `DELETE`.
         * `ANALYZE` — запросы `ANALYZE`.
         * `DATA_DEFINITION` — запросы `CREATE`, `ALTER` и `DROP` для схем, таблиц, представлений и материализованных представлений, а также запросы управления подготовленными выражениями, правами доступа, сессиями и транзакциями.
         * `ALTER_TABLE_EXECUTE` — запросы вида `ALTER TABLE ... EXECUTE`.
     
       * `source` — имя источника запроса или регулярное выражение Java. Правило срабатывает, если имя источника запроса соответствует регулярному выражению. Если параметр не указан, правило срабатывает для запросов из любых источников.
       * `clientTags` — список тегов. Правило срабатывает, только если запрос содержит все указанные теги. Если параметр не указан, правило срабатывает для запросов с любыми тегами.
       * `group` — полное имя целевой ресурсной группы. Включает имена всех ее родительских групп, разделенных точками, начиная с корневой группы. В имени группы могут использоваться подстановки переменных в формате `${<имя_переменной>}`. Целевая группа не может иметь дочерних групп.
     
       {% note warning %}
     
       Запрос, не соответствующий ни одному заданному правилу, отклоняется с ошибкой. Чтобы этого не происходило, добавьте в конец описания правило без ограничивающих условий, содержащее только параметр `group`.
     
       {% endnote %}
     
     * `cpuQuotaPeriod` — период расчета квоты CPU для ресурсных групп. Задается как целое число секунд, минут или часов, например `140s`, `30m` или `1h`.
     
     Подробнее о дереве групп и правилах маршрутизации в разделе [Ресурсные группы в Managed Service for Trino](../concepts/resource-groups.md).

     {% note info %}

     Вы также можете создать отдельный JSON-файл с описанием ресурсных групп и правил маршрутизации и передать его в параметре `resource_groups` следующим образом:

     ```hcl
     resource_groups = file("resource-groups.json")
     ```

     {% endnote %}

  1. Проверьте корректность настроек.

      1. В командной строке перейдите в каталог, в котором расположены актуальные конфигурационные файлы Terraform с планом инфраструктуры.
      1. Выполните команду:
      
         ```bash
         terraform validate
         ```
      
         Если в файлах конфигурации есть ошибки, Terraform на них укажет.

  1. Подтвердите изменение ресурсов.

      1. Выполните команду для просмотра планируемых изменений:
      
         ```bash
         terraform plan
         ```
      
         Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
      
      1. Если вас устраивают планируемые изменения, внесите их:
         1. Выполните команду:
      
            ```bash
            terraform apply
            ```
      
         1. Подтвердите изменение ресурсов.
         1. Дождитесь завершения операции.

  Подробнее в [документации провайдера Terraform](../../terraform/resources/trino_access_control.md).

- REST API {#api}

  1. [Получите IAM-токен для аутентификации в API](../api-ref/authentication.md) и поместите токен в переменную среды окружения:

      ```bash
      export IAM_TOKEN="<IAM-токен>"
      ```

  1. Создайте файл `body.json` и добавьте в него следующее содержимое:

     ```json
     {
       <Параметры_кластера>
       ...
       "trino": {
         ...
         "resourceManagement": {
           "resourceGroups": {
             "rootGroups": [
               {
                 "name" : "<имя_ресурсной_группы>",
                 "softMemoryLimit" : "<лимит_использования_памяти>",
                 "softConcurrencyLimit" : "<мягкий_лимит_числа_запущенных_запросов>",
                 "hardConcurrencyLimit" : "<жесткий_лимит_числа_запущенных_запросов>",
                 "softCpuLimit" : "<мягкий_лимит_процессорного_времени>",
                 "hardCpuLimit" : "<жесткий_лимит_процессорного_времени>",
                 "maxQueued" : "<лимит_числа_запросов_в_очереди>",
                 "schedulingPolicy" : "<политика_планирования_запросов>",
                 "schedulingWeight" : "<вес_группы>",
                 "subGroups": [
                   {
                     <Дочерняя_ресурсная_группа_1>
                     ...
                     "subGroups" : [<список_дочерних_групп_следующих уровней>]
                   },
                   {
                     <Дочерняя_ресурсная_группа_2>
                     ...
                     "subGroups" : [<список_дочерних_групп_следующих уровней>]
                   },
                   ...
                   {
                     <Дочерняя_ресурсная_группа_N>
                     ...
                     "subGroups" : [<список_дочерних_групп_следующих уровней>]
                   }
                 ]
               },
               {
                 <Корневая_ресурсная_группа_2>
               },
               ...
               {
                 <Корневая_ресурсная_группа_N>
               }
             ],
             "selectors": [
               {
                 "user": "<регулярное_выражение_для_имен_пользователей>",
                 "userGroup": "<регулярное_выражение_для_групп_пользователей>",
                 "queryType": "<тип_запроса>",
                 "source": "<регулярное_выражение_для_источников_запросов>",
                 "clientTags": ["<список_тегов>"],
                 "group": "<имя_ресурсной_группы>"
               },
               {
                 <Правило_маршрутизации_2> 
               },
               ...
               {
                 <Правило_маршрутизации_N>
               }
             ],
             "cpuQuotaPeriod": "<период_расчета_квоты_CPU>"
           }
           ...
         },
       }
     }
     ```

     Где:

     * `rootGroups` — описание дерева ресурсных групп. Параметры `name`, `hardConcurrencyLimit` и `maxQueued` являются обязательными.
       * `name` — имя группы.
     
         Имя группы может представлять собой шаблон, использующий подстановки переменных в формате `${<имя_переменной>}`. Имя-шаблон может содержать следующие виды переменных:
         * Встроенные: `USER` — имя пользователя, `SOURCE` — источник запроса.
         * Пользовательские: объявляются в параметрах правил маршрутизации `user`, `userGroup` и `source`.
     
         При маршрутизации запросов Managed Service for Trino будет создавать экземпляры группы с динамически сформированными именами.
     
       * `softMemoryLimit` — максимальный объем доступной памяти, который может использоваться группой. При достижении этого лимита новые запросы будут поставлены в очередь. Значение `softMemoryLimit` может задаваться одним из способов:
         * В процентах от общего объема доступной памяти, например `10%`.
         * Как абсолютное значение объема памяти, например `1GB`. Можно использовать один из следующих суффиксов: `B`, `kB`, `MB`, `GB`, `TB`, `PB`.
       * `softConcurrencyLimit` — мягкий лимит на число запущенных запросов. При достижении этого лимита новые запросы будут запускаться в группе, только если соседние группы не могут принимать запросы или превысили свои мягкие лимиты. В противном случае новые запросы будут поставлены в очередь.
       * `hardConcurrencyLimit` — максимальное число запущенных запросов. При достижении этого лимита новые запросы будут поставлены в очередь.
       * `softCpuLimit` — мягкий лимит процессорного времени. При достижении этого лимита значение `hardConcurrencyLimit` будет снижено до окончания текущего периода расчета квоты CPU. Значение `softCpuLimit` не может быть больше, чем `hardCpuLimit`.
       * `hardCpuLimit` — жесткий лимит процессорного времени. При достижении этого лимита новые запросы будут поставлены в очередь.
     
       {% note info %}
     
       Если задан хотя бы один из параметров — `softCpuLimit` или `hardCpuLimit`, задайте также параметр `cpuQuotaPeriod`.
     
       {% endnote %}
     
       * `maxQueued` — максимальное число запросов в очереди. При достижении этого лимита новые запросы будут отклонены с ошибкой.
       * `schedulingPolicy` — [политика планирования запросов](../concepts/resource-groups.md#policy). Возможные значения:
         * `FAIR`
         * `WEIGHTED`
         * `WEIGHTED_FAIR`
         * `QUERY_PRIORITY`
     
         Если параметр не указан, действует политика `FAIR`.
     
       * `schedulingWeight` — вес группы, используемый в политиках планирования `WEIGHTED` и `WEIGHTED_FAIR`.
     
         Если параметр не указан, вес группы равен `1`.
     
       * `subGroups` — описания дочерних групп.
     
     * `selectors` — описание правил маршрутизации. Параметр `group` является обязательным.
       * `user` — имя пользователя, отправившего запрос, или регулярное выражение Java. Правило срабатывает, если имя пользователя соответствует регулярному выражению. Если параметр не указан, правило срабатывает для запросов любых пользователей.
       * `userGroup` — имя группы пользователя, отправившего запрос, или регулярное выражение Java для групп пользователей. Правило срабатывает, если имя группы пользователя соответствует регулярному выражению. Если параметр не указан, правило срабатывает для запросов пользователей любых групп.
       * `queryType` — тип запроса. Возможные значения:
         * `SELECT` — запросы `SELECT`.
         * `EXPLAIN` — запросы `EXPLAIN`, кроме `EXPLAIN ANALYZE`.
         * `DESCRIBE` — запросы `DESCRIBE`, `DESCRIBE INPUT` и `DESCRIBE OUTPUT`, а также запросы `SHOW` (например, `SHOW CATALOGS` или `SHOW SCHEMAS`).
         * `INSERT` — запросы `INSERT`, `CREATE TABLE AS` и `REFRESH MATERIALIZED VIEW`.
         * `MERGE` — запросы `MERGE`.
         * `DELETE` — запросы `DELETE`.
         * `ANALYZE` — запросы `ANALYZE`.
         * `DATA_DEFINITION` — запросы `CREATE`, `ALTER` и `DROP` для схем, таблиц, представлений и материализованных представлений, а также запросы управления подготовленными выражениями, правами доступа, сессиями и транзакциями.
         * `ALTER_TABLE_EXECUTE` — запросы вида `ALTER TABLE ... EXECUTE`.
     
       * `source` — имя источника запроса или регулярное выражение Java. Правило срабатывает, если имя источника запроса соответствует регулярному выражению. Если параметр не указан, правило срабатывает для запросов из любых источников.
       * `clientTags` — список тегов. Правило срабатывает, только если запрос содержит все указанные теги. Если параметр не указан, правило срабатывает для запросов с любыми тегами.
       * `group` — полное имя целевой ресурсной группы. Включает имена всех ее родительских групп, разделенных точками, начиная с корневой группы. В имени группы могут использоваться подстановки переменных в формате `${<имя_переменной>}`. Целевая группа не может иметь дочерних групп.
     
       {% note warning %}
     
       Запрос, не соответствующий ни одному заданному правилу, отклоняется с ошибкой. Чтобы этого не происходило, добавьте в конец описания правило без ограничивающих условий, содержащее только параметр `group`.
     
       {% endnote %}
     
     * `cpuQuotaPeriod` — период расчета квоты CPU для ресурсных групп. Задается как целое число секунд, минут или часов, например `140s`, `30m` или `1h`.
     
     Подробнее о дереве групп и правилах маршрутизации в разделе [Ресурсные группы в Managed Service for Trino](../concepts/resource-groups.md).

  1. Воспользуйтесь методом [Cluster.Create](../api-ref/Cluster/create.md) и выполните запрос, например с помощью [cURL](https://curl.se/):

     ```bash
     curl \
         --request POST \
         --header "Authorization: Bearer $IAM_TOKEN" \
         --url 'https://trino.api.cloud.yandex.net/managed-trino/v1/clusters'
         --data '@body.json'
     ```

  1. Убедитесь, что запрос был выполнен успешно, изучив [ответ сервера](../api-ref/Cluster/create.md#yandex.cloud.operation.Operation).

- gRPC API {#grpc-api}
  
  1. [Получите IAM-токен для аутентификации в API](../api-ref/authentication.md) и поместите токен в переменную среды окружения:

      ```bash
      export IAM_TOKEN="<IAM-токен>"
      ```

  1. Клонируйте репозиторий [cloudapi](https://github.com/yandex-cloud/cloudapi):
     
     ```bash
     cd ~/ && git clone --depth=1 https://github.com/yandex-cloud/cloudapi
     ```
     
     Далее предполагается, что содержимое репозитория находится в директории `~/cloudapi/`.

  1. Создайте файл `body.json` и добавьте в него следующее содержимое:

     ```json
     {
       <Параметры_кластера>
       ...
       "trino": {
         ...
         "resource_management": {
           "resource_groups": {
             "root_groups": [
               {
                 "name" : "<имя_ресурсной_группы>",
                 "soft_memory_limit" : "<лимит_использования_памяти>",
                 "soft_concurrency_limit" : "<мягкий_лимит_числа_запущенных_запросов>",
                 "hard_concurrency_limit" : "<жесткий_лимит_числа_запущенных_запросов>",
                 "soft_cpu_limit" : "<мягкий_лимит_процессорного_времени>",
                 "hard_cpu_limit" : "<жесткий_лимит_процессорного_времени>",
                 "max_queued" : "<лимит_числа_запросов_в_очереди>",
                 "scheduling_policy" : "<политика_планирования_запросов>",
                 "scheduling_weight" : "<вес_группы>",
                 "sub_groups": [
                   {
                     <Дочерняя_ресурсная_группа_1>
                     ...
                     "sub_groups" : [<список_дочерних_групп_следующих уровней>]
                   },
                   {
                     <Дочерняя_ресурсная_группа_2>
                     ...
                     "sub_groups" : [<список_дочерних_групп_следующих уровней>]
                   },
                   ...
                   {
                     <Дочерняя_ресурсная_группа_N>
                     ...
                     "sub_groups" : [<список_дочерних_групп_следующих уровней>]
                   }
                 ]
               },
               {
                 <Корневая_ресурсная_группа_2>
               },
               ...
               {
                 <Корневая_ресурсная_группа_N>
               }
             ],
             "selectors": [
               {
                 "user": "<регулярное_выражение_для_имен_пользователей>",
                 "user_group": "<регулярное_выражение_для_групп_пользователей>",
                 "query_type": "<тип_запроса>",
                 "source": "<регулярное_выражение_для_источников_запросов>",
                 "client_tags": ["<список_тегов>"],
                 "group": "<имя_ресурсной_группы>"
               },
               {
                 <Правило_маршрутизации_2> 
               },
               ...
               {
                 <Правило_маршрутизации_N>
               }
             ],
             "cpu_quota_period": "<период_расчета_квоты_CPU>"
           }
           ...
         },
       }
     }
     ```

     Где:

     * `root_groups` — описание дерева ресурсных групп. Параметры `name`, `hard_concurrency_limit` и `max_queued` являются обязательными.
       * `name` — имя группы.
     
         Имя группы может представлять собой шаблон, использующий подстановки переменных в формате `${<имя_переменной>}`. Имя-шаблон может содержать следующие виды переменных:
         * Встроенные: `USER` — имя пользователя, `SOURCE` — источник запроса.
         * Пользовательские: объявляются в параметрах правил маршрутизации `user`, `user_group` и `source`.
     
         При маршрутизации запросов Managed Service for Trino будет создавать экземпляры группы с динамически сформированными именами.
     
       * `soft_memory_limit` — максимальный объем доступной памяти, который может использоваться группой. При достижении этого лимита новые запросы будут поставлены в очередь. Значение `soft_memory_limit` может задаваться одним из способов:
         * В процентах от общего объема доступной памяти, например `10%`.
         * Как абсолютное значение объема памяти, например `1GB`. Можно использовать один из следующих суффиксов: `B`, `kB`, `MB`, `GB`, `TB`, `PB`.
       * `soft_concurrency_limit` — мягкий лимит на число запущенных запросов. При достижении этого лимита новые запросы будут запускаться в группе, только если соседние группы не могут принимать запросы или превысили свои мягкие лимиты. В противном случае новые запросы будут поставлены в очередь.
       * `hard_concurrency_limit` — максимальное число запущенных запросов. При достижении этого лимита новые запросы будут поставлены в очередь.
       * `soft_cpu_limit` — мягкий лимит процессорного времени. При достижении этого лимита значение `hard_concurrency_limit` будет снижено до окончания текущего периода расчета квоты CPU. Значение `soft_cpu_limit` не может быть больше, чем `hard_cpu_limit`.
       * `hard_cpu_limit` — жесткий лимит процессорного времени. При достижении этого лимита новые запросы будут поставлены в очередь.
     
       {% note info %}
     
       Если задан хотя бы один из параметров — `soft_cpu_limit` или `hard_cpu_limit`, задайте также параметр `cpu_quota_period`.
     
       {% endnote %}
     
       * `max_queued` — максимальное число запросов в очереди. При достижении этого лимита новые запросы будут отклонены с ошибкой.
       * `scheduling_policy` — [политика планирования запросов](../concepts/resource-groups.md#policy). Возможные значения:
         * `FAIR`
         * `WEIGHTED`
         * `WEIGHTED_FAIR`
         * `QUERY_PRIORITY`
     
         Если параметр не указан, действует политика `FAIR`.
     
       * `scheduling_weight` — вес группы, используемый в политиках планирования `WEIGHTED` и `WEIGHTED_FAIR`.
     
         Если параметр не указан, вес группы равен `1`.
     
       * `sub_groups` — описания дочерних групп.
     
     * `selectors` — описание правил маршрутизации. Параметр `group` является обязательным.
       * `user` — имя пользователя, отправившего запрос, или регулярное выражение Java. Правило срабатывает, если имя пользователя соответствует регулярному выражению. Если параметр не указан, правило срабатывает для запросов любых пользователей.
       * `user_group` — имя группы пользователя, отправившего запрос, или регулярное выражение Java для групп пользователей. Правило срабатывает, если имя группы пользователя соответствует регулярному выражению. Если параметр не указан, правило срабатывает для запросов пользователей любых групп.
       * `query_type` — тип запроса. Возможные значения:
         * `SELECT` — запросы `SELECT`.
         * `EXPLAIN` — запросы `EXPLAIN`, кроме `EXPLAIN ANALYZE`.
         * `DESCRIBE` — запросы `DESCRIBE`, `DESCRIBE INPUT` и `DESCRIBE OUTPUT`, а также запросы `SHOW` (например, `SHOW CATALOGS` или `SHOW SCHEMAS`).
         * `INSERT` — запросы `INSERT`, `CREATE TABLE AS` и `REFRESH MATERIALIZED VIEW`.
         * `MERGE` — запросы `MERGE`.
         * `DELETE` — запросы `DELETE`.
         * `ANALYZE` — запросы `ANALYZE`.
         * `DATA_DEFINITION` — запросы `CREATE`, `ALTER` и `DROP` для схем, таблиц, представлений и материализованных представлений, а также запросы управления подготовленными выражениями, правами доступа, сессиями и транзакциями.
         * `ALTER_TABLE_EXECUTE` — запросы вида `ALTER TABLE ... EXECUTE`.
     
       * `source` — имя источника запроса или регулярное выражение Java. Правило срабатывает, если имя источника запроса соответствует регулярному выражению. Если параметр не указан, правило срабатывает для запросов из любых источников.
       * `client_tags` — список тегов. Правило срабатывает, только если запрос содержит все указанные теги. Если параметр не указан, правило срабатывает для запросов с любыми тегами.
       * `group` — полное имя целевой ресурсной группы. Включает имена всех ее родительских групп, разделенных точками, начиная с корневой группы. В имени группы могут использоваться подстановки переменных в формате `${<имя_переменной>}`. Целевая группа не может иметь дочерних групп.
     
       {% note warning %}
     
       Запрос, не соответствующий ни одному заданному правилу, отклоняется с ошибкой. Чтобы этого не происходило, добавьте в конец описания правило без ограничивающих условий, содержащее только параметр `group`.
     
       {% endnote %}
     
     * `cpu_quota_period` — период расчета квоты CPU для ресурсных групп. Задается как целое число секунд, минут или часов, например `140s`, `30m` или `1h`.
     
     Подробнее о дереве групп и правилах маршрутизации в разделе [Ресурсные группы в Managed Service for Trino](../concepts/resource-groups.md).

     Доступные параметры кластера и их описания представлены в [инструкции](cluster-create.md#create-cluster).

  1. Воспользуйтесь вызовом [ClusterService.Create](../api-ref/grpc/Cluster/create.md) и выполните запрос, например с помощью [gRPCurl](https://github.com/fullstorydev/grpcurl):

      ```bash
      grpcurl \
          -format json \
          -import-path ~/cloudapi/ \
          -import-path ~/cloudapi/third_party/googleapis/ \
          -proto ~/cloudapi/yandex/cloud/trino/v1/cluster_service.proto \
          -rpc-header "Authorization: Bearer $IAM_TOKEN" \
          -d @ \
          trino.api.cloud.yandex.net:443 \
          yandex.cloud.trino.v1.ClusterService.Create \
          < body.json
      ```

  1. Убедитесь, что запрос был выполнен успешно, изучив [ответ сервера](../api-ref/grpc/Cluster/create.md#yandex.cloud.operation.Operation).

{% endlist %}

## Задать или изменить конфигурацию ресурсных групп кластера {#set-at-update}

{% list tabs group=instructions %}

- Консоль управления {#console}

  1. В [консоли управления](https://kz.console.yandex.cloud) перейдите в нужный каталог.
  1. Перейдите в сервис **Managed Service for&nbsp;Trino**.
  1. Нажмите на имя нужного кластера.
  1. Перейдите в блок **Управление ресурсами**.
  1. В поле **CPU quota period** задайте новое значение периода расчета квоты CPU для ресурсных групп.
  1. Чтобы добавить новую ресурсную группу, нажмите кнопку **Добавить группу** и задайте параметры группы:

     1. (Опционально) Выберите родительскую группу.
     1. Задайте имя ресурсной группы.
     
        Имя группы может представлять собой шаблон, использующий подстановки переменных в формате `${<имя_переменной>}`. Имя-шаблон может содержать следующие виды переменных:
        * Встроенные: `USER` — имя пользователя, `SOURCE` — источник запроса.
        * Пользовательские: объявляются в параметрах правил маршрутизации **Пользователь** и **Источник**.
     
        При маршрутизации запросов Managed Service for Trino будет создавать экземпляры группы с динамически сформированными именами.
     
     1. В поле **Max queued** задайте максимальное число запросов в очереди (должно быть больше `1`). При достижении этого лимита новые запросы будут отклонены с ошибкой.
     1. (Опционально) В поле **Soft concurrency limit** задайте мягкий лимит на число запущенных запросов. При достижении этого лимита новые запросы будут запускаться в группе, только если соседние группы не могут принимать запросы или превысили свои мягкие лимиты. В противном случае новые запросы будут поставлены в очередь.
     1. В поле **Hard concurrency limit** задайте максимальное число запущенных запросов (должно быть больше `1`). При достижении этого лимита новые запросы будут поставлены в очередь.
     1. (Опционально) В поле **Soft memory limit, %** задайте максимальный процент доступной памяти, который может использоваться группой. При достижении этого лимита новые запросы будут поставлены в очередь.
     1. (Опционально) В поле **Soft CPU limit** задайте мягкий лимит процессорного времени. При достижении этого лимита максимальное число запущенных запросов будет снижено до окончания текущего периода расчета квоты CPU. Не может быть больше, чем **Hard CPU limit**. Чтобы задать **Soft CPU limit**, нужно также задать **CPU quota period**.
     1. (Опционально) В поле **Hard CPU limit** задайте жесткий лимит процессорного времени. При достижении этого лимита новые запросы будут поставлены в очередь. Чтобы задать **Hard CPU limit**, нужно также задать **CPU quota period**.
     1. (Опционально) В поле **Scheduling policy** задайте [политику планирования запросов](../concepts/resource-groups.md#policy). Возможные значения: `fair`, `weighted`, `weighted_fair`, `query_priority`. Значение по умолчанию — `none` (действует политика `fair`).
     1. (Опционально) В поле **Scheduling weight** задайте вес группы, используемый в политиках планирования `weighted` и `weighted_fair`.
     
     Подробнее о дереве групп в разделе [Ресурсные группы в Managed Service for Trino](../concepts/resource-groups.md).

  1. (Опционально) Добавьте другие ресурсные группы аналогичным образом.
  1. Чтобы отредактировать ресурсную группу:
     1. В строке этой группы нажмите на значок ![trash-bin](../../_assets/console-icons/pencil.svg).
     1. Измените параметры группы и нажмите кнопку **Редактировать**.
  1. Чтобы добавить новое правило маршрутизации, нажмите кнопку **Добавить правило** и задайте параметры правила:

     1. (Опционально) В поле **Пользователь** задайте имя пользователя, отправившего запрос, или регулярное выражение Java. Правило срабатывает, если имя пользователя соответствует регулярному выражению. Если параметр не указан, правило срабатывает для запросов от любых пользователей.
     1. (Опционально) В поле **Группа** задайте имя группы пользователя, отправившего запрос, или регулярное выражение Java. Правило срабатывает, если имя группы пользователя соответствует регулярному выражению. Если параметр не указан, правило срабатывает для запросов пользователей любых групп.
     1. (Опционально) В поле **Тип запроса** выберите тип запроса. Возможные значения:
        * `SELECT` — запросы `SELECT`.
        * `EXPLAIN` — запросы `EXPLAIN`, кроме `EXPLAIN ANALYZE`.
        * `DESCRIBE` — запросы `DESCRIBE`, `DESCRIBE INPUT` и `DESCRIBE OUTPUT`, а также запросы `SHOW` (например, `SHOW CATALOGS` или `SHOW SCHEMAS`).
        * `INSERT` — запросы `INSERT`, `CREATE TABLE AS` и `REFRESH MATERIALIZED VIEW`.
        * `MERGE` — запросы `MERGE`.
        * `DELETE` — запросы `DELETE`.
        * `ANALYZE` — запросы `ANALYZE`.
        * `DATA_DEFINITION` — запросы `CREATE`, `ALTER` и `DROP` для схем, таблиц, представлений и материализованных представлений, а также запросы управления подготовленными выражениями, правами доступа, сессиями и транзакциями.
        * `ALTER_TABLE_EXECUTE` — запросы вида `ALTER TABLE ... EXECUTE`.
     
     1. (Опционально) В поле **Источник** задайте имя источника запроса или регулярное выражение Java. Правило срабатывает, если имя источника запроса соответствует регулярному выражению. Если параметр не указан, правило срабатывает для запросов из любых источников.
     1. В поле **Ресурсная группа** выберите ресурсную группу, в которой будет запущен запрос. Целевая группа не может иметь дочерних групп.
     1. (Опционально) В поле **Теги** укажите теги через запятую. Правило срабатывает, только если запрос содержит все указанные теги. Если параметр не указан, правило срабатывает для запросов с любыми тегами.
     
     {% note warning %}
     
     Запрос, не соответствующий ни одному заданному правилу, отклоняется с ошибкой. Чтобы этого не происходило, добавьте в конец описания правило без ограничивающих условий, содержащее только параметр **Ресурсная группа**.
     
     {% endnote %}
     
     Подробнее о правилах маршрутизации в разделе [Ресурсные группы в Managed Service for Trino](../concepts/resource-groups.md).

  1. (Опционально) Добавьте другие правила маршрутизации аналогичным образом.
  1. Чтобы отредактировать правило маршрутизации:
     1. В строке этого правила нажмите на значок ![pencil](../../_assets/console-icons/pencil.svg).
     1. Измените параметры правила.
  1. Нажмите кнопку **Сохранить изменения**.

- CLI {#cli}

  Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), [установите и инициализируйте его](../../cli/quickstart.md#install).

  По умолчанию используется каталог, указанный при [создании](../../cli/operations/profile/profile-create.md) профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду `yc config set folder-id <идентификатор_каталога>`. Также для любой команды вы можете указать другой каталог с помощью параметров `--folder-name` или `--folder-id`. Если вы обращаетесь к ресурсу по имени, поиск будет выполнен в каталоге по умолчанию. Если вы обращаетесь к ресурсу по идентификатору, поиск будет выполнен глобально — во всех каталогах с учетом прав доступа.

  Чтобы задать конфигурацию ресурсных групп:

  1. Если описание ресурсных групп и правил маршрутизации в кластере Managed Service for Trino еще не задано, создайте файл с описанием в формате JSON или YAML. Ниже представлен пример YAML-файла `resource-groups.yaml`.

     ```yaml
     rootGroups:
       # Корневая ресурсная группа 1
       - name: "<имя_ресурсной_группы>"
         softMemoryLimit: "<лимит_использования_памяти>"
         softConcurrencyLimit: <мягкий_лимит_числа_запущенных_запросов>
         hardConcurrencyLimit: <жесткий_лимит_числа_запущенных_запросов>
         softCpuLimit: <мягкий_лимит_процессорного_времени>
         hardCpuLimit: <жесткий_лимит_процессорного_времени>
         maxQueued: <лимит_числа_запросов_в_очереди>
         schedulingPolicy: "<политика_планирования_запросов>"
         schedulingWeight: <вес_группы>
         subGroups:
           # Дочерняя ресурсная группа 1
           - name: "<имя_ресурсной_группы>"
             ...
             subGroups: [<список_дочерних_групп_следующих_уровней>]
           # Дочерняя ресурсная группа 2
           - name: "<имя_ресурсной_группы>"
             ...
             subGroups: [<список_дочерних_групп_следующих_уровней>]
           ...
           # Дочерняя ресурсная группа N
           - name: "<имя_ресурсной_группы>"
             ...
             subGroups: [<список_дочерних_групп_следующих_уровней>]
       # Корневая ресурсная группа 2
       - name: "<имя_ресурсной_группы_2>"
         ...
       # Корневая ресурсная группа N
       - name: "<имя_ресурсной_группы_N>"
         ...
     selectors:
       # Правило маршрутизации 1
       - user: "<регулярное_выражение_для_имен_пользователей>"
         userGroup: "<регулярное_выражение_для_групп_пользователей>"
         queryType: "<тип_запроса>"
         source: "<регулярное_выражение_для_источников_запросов>"
         clientTags: ["<список_тегов>"]
         group: "<имя_ресурсной_группы>"
       # Правило маршрутизации 2
       - ...
       ...
       # Правило маршрутизации N
       - ...
     cpuQuotaPeriod: "<период_расчета_квоты_CPU>"
     ```

     Где:

     * `rootGroups` — описание дерева ресурсных групп. Параметры `name`, `hardConcurrencyLimit` и `maxQueued` являются обязательными.
       * `name` — имя группы.
     
         Имя группы может представлять собой шаблон, использующий подстановки переменных в формате `${<имя_переменной>}`. Имя-шаблон может содержать следующие виды переменных:
         * Встроенные: `USER` — имя пользователя, `SOURCE` — источник запроса.
         * Пользовательские: объявляются в параметрах правил маршрутизации `user`, `userGroup` и `source`.
     
         При маршрутизации запросов Managed Service for Trino будет создавать экземпляры группы с динамически сформированными именами.
     
       * `softMemoryLimit` — максимальный объем доступной памяти, который может использоваться группой. При достижении этого лимита новые запросы будут поставлены в очередь. Значение `softMemoryLimit` может задаваться одним из способов:
         * В процентах от общего объема доступной памяти, например `10%`.
         * Как абсолютное значение объема памяти, например `1GB`. Можно использовать один из следующих суффиксов: `B`, `kB`, `MB`, `GB`, `TB`, `PB`.
       * `softConcurrencyLimit` — мягкий лимит на число запущенных запросов. При достижении этого лимита новые запросы будут запускаться в группе, только если соседние группы не могут принимать запросы или превысили свои мягкие лимиты. В противном случае новые запросы будут поставлены в очередь.
       * `hardConcurrencyLimit` — максимальное число запущенных запросов. При достижении этого лимита новые запросы будут поставлены в очередь.
       * `softCpuLimit` — мягкий лимит процессорного времени. При достижении этого лимита значение `hardConcurrencyLimit` будет снижено до окончания текущего периода расчета квоты CPU. Значение `softCpuLimit` не может быть больше, чем `hardCpuLimit`.
       * `hardCpuLimit` — жесткий лимит процессорного времени. При достижении этого лимита новые запросы будут поставлены в очередь.
     
       {% note info %}
     
       Если задан хотя бы один из параметров — `softCpuLimit` или `hardCpuLimit`, задайте также параметр `cpuQuotaPeriod`.
     
       {% endnote %}
     
       * `maxQueued` — максимальное число запросов в очереди. При достижении этого лимита новые запросы будут отклонены с ошибкой.
       * `schedulingPolicy` — [политика планирования запросов](../concepts/resource-groups.md#policy). Возможные значения:
         * `FAIR`
         * `WEIGHTED`
         * `WEIGHTED_FAIR`
         * `QUERY_PRIORITY`
     
         Если параметр не указан, действует политика `FAIR`.
     
       * `schedulingWeight` — вес группы, используемый в политиках планирования `WEIGHTED` и `WEIGHTED_FAIR`.
     
         Если параметр не указан, вес группы равен `1`.
     
       * `subGroups` — описания дочерних групп.
     
     * `selectors` — описание правил маршрутизации. Параметр `group` является обязательным.
       * `user` — имя пользователя, отправившего запрос, или регулярное выражение Java. Правило срабатывает, если имя пользователя соответствует регулярному выражению. Если параметр не указан, правило срабатывает для запросов любых пользователей.
       * `userGroup` — имя группы пользователя, отправившего запрос, или регулярное выражение Java для групп пользователей. Правило срабатывает, если имя группы пользователя соответствует регулярному выражению. Если параметр не указан, правило срабатывает для запросов пользователей любых групп.
       * `queryType` — тип запроса. Возможные значения:
         * `SELECT` — запросы `SELECT`.
         * `EXPLAIN` — запросы `EXPLAIN`, кроме `EXPLAIN ANALYZE`.
         * `DESCRIBE` — запросы `DESCRIBE`, `DESCRIBE INPUT` и `DESCRIBE OUTPUT`, а также запросы `SHOW` (например, `SHOW CATALOGS` или `SHOW SCHEMAS`).
         * `INSERT` — запросы `INSERT`, `CREATE TABLE AS` и `REFRESH MATERIALIZED VIEW`.
         * `MERGE` — запросы `MERGE`.
         * `DELETE` — запросы `DELETE`.
         * `ANALYZE` — запросы `ANALYZE`.
         * `DATA_DEFINITION` — запросы `CREATE`, `ALTER` и `DROP` для схем, таблиц, представлений и материализованных представлений, а также запросы управления подготовленными выражениями, правами доступа, сессиями и транзакциями.
         * `ALTER_TABLE_EXECUTE` — запросы вида `ALTER TABLE ... EXECUTE`.
     
       * `source` — имя источника запроса или регулярное выражение Java. Правило срабатывает, если имя источника запроса соответствует регулярному выражению. Если параметр не указан, правило срабатывает для запросов из любых источников.
       * `clientTags` — список тегов. Правило срабатывает, только если запрос содержит все указанные теги. Если параметр не указан, правило срабатывает для запросов с любыми тегами.
       * `group` — полное имя целевой ресурсной группы. Включает имена всех ее родительских групп, разделенных точками, начиная с корневой группы. В имени группы могут использоваться подстановки переменных в формате `${<имя_переменной>}`. Целевая группа не может иметь дочерних групп.
     
       {% note warning %}
     
       Запрос, не соответствующий ни одному заданному правилу, отклоняется с ошибкой. Чтобы этого не происходило, добавьте в конец описания правило без ограничивающих условий, содержащее только параметр `group`.
     
       {% endnote %}
     
     * `cpuQuotaPeriod` — период расчета квоты CPU для ресурсных групп. Задается как целое число секунд, минут или часов, например `140s`, `30m` или `1h`.
     
     Подробнее о дереве групп и правилах маршрутизации в разделе [Ресурсные группы в Managed Service for Trino](../concepts/resource-groups.md).

  1. Если описание ресурсных групп и правил маршрутизации уже задано, откройте файл `resource-groups.yaml` и внесите в него изменения. Вы можете:

     * добавить новые ресурсные группы и правила маршрутизации;
     * изменить параметры существующих групп и правил;
     * удалить ненужные группы и правила.

  1. Выполните команду:

  ```bash
  yc managed-trino cluster set-resource-groups <имя_или_идентификатор_кластера> \
     --from-file resource-groups.yaml
  ```

  Имя и идентификатор кластера можно получить со [списком кластеров](cluster-list.md#list-clusters) в каталоге.   

- Terraform {#tf}

  1. Откройте актуальный конфигурационный файл Terraform с планом инфраструктуры.
  
     Инструкция по созданию файла описана в разделе [Создание кластера](cluster-create.md).
  
  1. Если описание ресурсных групп и правил маршрутизации в кластере Managed Service for Trino еще не задано, добавьте в описание кластера блок `resource_groups`:

     ```hcl
     resource_groups = jsonencode(
       {
         "rootGroups" : [
           # Корневая ресурсная группа 1
           {
             "name" : "<имя_ресурсной_группы>",
             "softMemoryLimit" : "<лимит_использования_памяти>",
             "softConcurrencyLimit" : <мягкий_лимит_числа_запущенных_запросов>,
             "hardConcurrencyLimit" : <жесткий_лимит_числа_запущенных_запросов>,
             "softCpuLimit" : <мягкий_лимит_процессорного_времени>,
             "hardCpuLimit" : <жесткий_лимит_процессорного_времени>,
             "maxQueued" : <лимит_числа_запросов_в_очереди>,
             "schedulingPolicy" : "<политика_планирования_запросов>",
             "schedulingWeight" : <вес_группы>,
             "subGroups" : [
               # Дочерняя ресурсная группа 1
               {
                 ...
                 "subGroups" : [<список_дочерних_групп_следующих уровней>]
               },
               # Дочерняя ресурсная группа 2
               {
                 ...
                 "subGroups" : [<список_дочерних_групп_следующих уровней>]
               },
               ...
               # Дочерняя ресурсная группа N
               {
                 ...
                 "subGroups" : [<список_дочерних_групп_следующих уровней>]
               }
             ]
           },
           # Корневая ресурсная группа 2
           {
             ... 
           },
           ...
           # Корневая ресурсная группа N
           {
             ... 
           }
         ],
         "selectors" : [
           # Правило маршрутизации 1
           {
             "user" : "<регулярное_выражение_для_имен_пользователей>",
             "userGroup" : "<регулярное_выражение_для_групп_пользователей>",
             "queryType" : "<тип_запроса>",
             "source" : "<регулярное_выражение_для_источников_запросов>",
             "clientTags" : ["<список_тегов>"],
             "group" : "<имя_ресурсной_группы>"
           },
           # Правило маршрутизации 2
           {
             ... 
           },
           ...
           # Правило маршрутизации N
           {
             ... 
           }
         ],
         "cpuQuotaPeriod" : "<период_расчета_квоты_CPU>"
       }
     )
     ```

     Где:

     * `rootGroups` — описание дерева ресурсных групп. Параметры `name`, `hardConcurrencyLimit` и `maxQueued` являются обязательными.
       * `name` — имя группы.
     
         Имя группы может представлять собой шаблон, использующий подстановки переменных в формате `${<имя_переменной>}`. Имя-шаблон может содержать следующие виды переменных:
         * Встроенные: `USER` — имя пользователя, `SOURCE` — источник запроса.
         * Пользовательские: объявляются в параметрах правил маршрутизации `user`, `userGroup` и `source`.
     
         При маршрутизации запросов Managed Service for Trino будет создавать экземпляры группы с динамически сформированными именами.
     
       * `softMemoryLimit` — максимальный объем доступной памяти, который может использоваться группой. При достижении этого лимита новые запросы будут поставлены в очередь. Значение `softMemoryLimit` может задаваться одним из способов:
         * В процентах от общего объема доступной памяти, например `10%`.
         * Как абсолютное значение объема памяти, например `1GB`. Можно использовать один из следующих суффиксов: `B`, `kB`, `MB`, `GB`, `TB`, `PB`.
       * `softConcurrencyLimit` — мягкий лимит на число запущенных запросов. При достижении этого лимита новые запросы будут запускаться в группе, только если соседние группы не могут принимать запросы или превысили свои мягкие лимиты. В противном случае новые запросы будут поставлены в очередь.
       * `hardConcurrencyLimit` — максимальное число запущенных запросов. При достижении этого лимита новые запросы будут поставлены в очередь.
       * `softCpuLimit` — мягкий лимит процессорного времени. При достижении этого лимита значение `hardConcurrencyLimit` будет снижено до окончания текущего периода расчета квоты CPU. Значение `softCpuLimit` не может быть больше, чем `hardCpuLimit`.
       * `hardCpuLimit` — жесткий лимит процессорного времени. При достижении этого лимита новые запросы будут поставлены в очередь.
     
       {% note info %}
     
       Если задан хотя бы один из параметров — `softCpuLimit` или `hardCpuLimit`, задайте также параметр `cpuQuotaPeriod`.
     
       {% endnote %}
     
       * `maxQueued` — максимальное число запросов в очереди. При достижении этого лимита новые запросы будут отклонены с ошибкой.
       * `schedulingPolicy` — [политика планирования запросов](../concepts/resource-groups.md#policy). Возможные значения:
         * `FAIR`
         * `WEIGHTED`
         * `WEIGHTED_FAIR`
         * `QUERY_PRIORITY`
     
         Если параметр не указан, действует политика `FAIR`.
     
       * `schedulingWeight` — вес группы, используемый в политиках планирования `WEIGHTED` и `WEIGHTED_FAIR`.
     
         Если параметр не указан, вес группы равен `1`.
     
       * `subGroups` — описания дочерних групп.
     
     * `selectors` — описание правил маршрутизации. Параметр `group` является обязательным.
       * `user` — имя пользователя, отправившего запрос, или регулярное выражение Java. Правило срабатывает, если имя пользователя соответствует регулярному выражению. Если параметр не указан, правило срабатывает для запросов любых пользователей.
       * `userGroup` — имя группы пользователя, отправившего запрос, или регулярное выражение Java для групп пользователей. Правило срабатывает, если имя группы пользователя соответствует регулярному выражению. Если параметр не указан, правило срабатывает для запросов пользователей любых групп.
       * `queryType` — тип запроса. Возможные значения:
         * `SELECT` — запросы `SELECT`.
         * `EXPLAIN` — запросы `EXPLAIN`, кроме `EXPLAIN ANALYZE`.
         * `DESCRIBE` — запросы `DESCRIBE`, `DESCRIBE INPUT` и `DESCRIBE OUTPUT`, а также запросы `SHOW` (например, `SHOW CATALOGS` или `SHOW SCHEMAS`).
         * `INSERT` — запросы `INSERT`, `CREATE TABLE AS` и `REFRESH MATERIALIZED VIEW`.
         * `MERGE` — запросы `MERGE`.
         * `DELETE` — запросы `DELETE`.
         * `ANALYZE` — запросы `ANALYZE`.
         * `DATA_DEFINITION` — запросы `CREATE`, `ALTER` и `DROP` для схем, таблиц, представлений и материализованных представлений, а также запросы управления подготовленными выражениями, правами доступа, сессиями и транзакциями.
         * `ALTER_TABLE_EXECUTE` — запросы вида `ALTER TABLE ... EXECUTE`.
     
       * `source` — имя источника запроса или регулярное выражение Java. Правило срабатывает, если имя источника запроса соответствует регулярному выражению. Если параметр не указан, правило срабатывает для запросов из любых источников.
       * `clientTags` — список тегов. Правило срабатывает, только если запрос содержит все указанные теги. Если параметр не указан, правило срабатывает для запросов с любыми тегами.
       * `group` — полное имя целевой ресурсной группы. Включает имена всех ее родительских групп, разделенных точками, начиная с корневой группы. В имени группы могут использоваться подстановки переменных в формате `${<имя_переменной>}`. Целевая группа не может иметь дочерних групп.
     
       {% note warning %}
     
       Запрос, не соответствующий ни одному заданному правилу, отклоняется с ошибкой. Чтобы этого не происходило, добавьте в конец описания правило без ограничивающих условий, содержащее только параметр `group`.
     
       {% endnote %}
     
     * `cpuQuotaPeriod` — период расчета квоты CPU для ресурсных групп. Задается как целое число секунд, минут или часов, например `140s`, `30m` или `1h`.
     
     Подробнее о дереве групп и правилах маршрутизации в разделе [Ресурсные группы в Managed Service for Trino](../concepts/resource-groups.md).

     {% note info %}

     Вы также можете создать отдельный JSON-файл с описанием ресурсных групп и правил маршрутизации и передать его в параметре `resource_groups` следующим образом:

     ```hcl
     resource_groups = file("resource-groups.json")
     ```

     {% endnote %}

  1. Если описание ресурсных групп и правил маршрутизации уже задано, внесите правки в блок `resource_groups` или JSON-файл. Вы можете:

     * добавить новые ресурсные группы и правила маршрутизации;
     * изменить параметры существующих групп и правил;
     * удалить ненужные группы и правила.

  1. Проверьте корректность настроек.

      1. В командной строке перейдите в каталог, в котором расположены актуальные конфигурационные файлы Terraform с планом инфраструктуры.
      1. Выполните команду:
      
         ```bash
         terraform validate
         ```
      
         Если в файлах конфигурации есть ошибки, Terraform на них укажет.

  1. Подтвердите изменение ресурсов.

      1. Выполните команду для просмотра планируемых изменений:
      
         ```bash
         terraform plan
         ```
      
         Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
      
      1. Если вас устраивают планируемые изменения, внесите их:
         1. Выполните команду:
      
            ```bash
            terraform apply
            ```
      
         1. Подтвердите изменение ресурсов.
         1. Дождитесь завершения операции.

  Подробнее в [документации провайдера Terraform](../../terraform/resources/trino_access_control.md).

- REST API {#api}

  1. [Получите IAM-токен для аутентификации в API](../api-ref/authentication.md) и поместите токен в переменную среды окружения:

      ```bash
      export IAM_TOKEN="<IAM-токен>"
      ```

  1. Создайте файл `body.json` и добавьте в него следующее содержимое:

     ```json
     {
       "updateMask": "<список_изменяемых_параметров>",
       "trino": {
         "resourceManagement": {
           "resourceGroups": {
             "rootGroups": [
               {
                 "name" : "<имя_ресурсной_группы>",
                 "softMemoryLimit" : "<лимит_использования_памяти>",
                 "softConcurrencyLimit" : "<мягкий_лимит_числа_запущенных_запросов>",
                 "hardConcurrencyLimit" : "<жесткий_лимит_числа_запущенных_запросов>",
                 "softCpuLimit" : "<мягкий_лимит_процессорного_времени>",
                 "hardCpuLimit" : "<жесткий_лимит_процессорного_времени>",
                 "maxQueued" : "<лимит_числа_запросов_в_очереди>",
                 "schedulingPolicy" : "<политика_планирования_запросов>",
                 "schedulingWeight" : "<вес_группы>",
                 "subGroups": [
                   {
                     <Дочерняя_ресурсная_группа_1>
                     ...
                     "subGroups" : [<список_дочерних_групп_следующих уровней>]
                   },
                   {
                     <Дочерняя_ресурсная_группа_2>
                     ...
                     "subGroups" : [<список_дочерних_групп_следующих уровней>]
                   },
                   ...
                   {
                     <Дочерняя_ресурсная_группа_N>
                     ...
                     "subGroups" : [<список_дочерних_групп_следующих уровней>]
                   }
                 ]
               },
               {
                 <Корневая_ресурсная_группа_2>
               },
               ...
               {
                 <Корневая_ресурсная_группа_N>
               }
             ],
             "selectors": [
               {
                 "user": "<регулярное_выражение_для_имен_пользователей>",
                 "userGroup": "<регулярное_выражение_для_групп_пользователей>",
                 "queryType": "<тип_запроса>",
                 "source": "<регулярное_выражение_для_источников_запросов>",
                 "clientTags": ["<список_тегов>"],
                 "group": "<имя_ресурсной_группы>"
               },
               {
                 <Правило_маршрутизации_2> 
               },
               ...
               {
                 <Правило_маршрутизации_N>
               }
             ],
             "cpuQuotaPeriod": "<период_расчета_квоты_CPU>"
           }
           ...
         },
       }
     }
     ```

     Где:

     * `updateMask` — перечень изменяемых параметров в строку через запятую.

       {% note warning %}

       При изменении кластера все параметры изменяемого объекта, которые не были явно переданы в запросе, будут переопределены на значения по умолчанию. Чтобы избежать этого, перечислите настройки, которые вы хотите изменить, в параметре `updateMask`.

       {% endnote %}

     * `rootGroups` — описание дерева ресурсных групп. Параметры `name`, `hardConcurrencyLimit` и `maxQueued` являются обязательными.
       * `name` — имя группы.
     
         Имя группы может представлять собой шаблон, использующий подстановки переменных в формате `${<имя_переменной>}`. Имя-шаблон может содержать следующие виды переменных:
         * Встроенные: `USER` — имя пользователя, `SOURCE` — источник запроса.
         * Пользовательские: объявляются в параметрах правил маршрутизации `user`, `userGroup` и `source`.
     
         При маршрутизации запросов Managed Service for Trino будет создавать экземпляры группы с динамически сформированными именами.
     
       * `softMemoryLimit` — максимальный объем доступной памяти, который может использоваться группой. При достижении этого лимита новые запросы будут поставлены в очередь. Значение `softMemoryLimit` может задаваться одним из способов:
         * В процентах от общего объема доступной памяти, например `10%`.
         * Как абсолютное значение объема памяти, например `1GB`. Можно использовать один из следующих суффиксов: `B`, `kB`, `MB`, `GB`, `TB`, `PB`.
       * `softConcurrencyLimit` — мягкий лимит на число запущенных запросов. При достижении этого лимита новые запросы будут запускаться в группе, только если соседние группы не могут принимать запросы или превысили свои мягкие лимиты. В противном случае новые запросы будут поставлены в очередь.
       * `hardConcurrencyLimit` — максимальное число запущенных запросов. При достижении этого лимита новые запросы будут поставлены в очередь.
       * `softCpuLimit` — мягкий лимит процессорного времени. При достижении этого лимита значение `hardConcurrencyLimit` будет снижено до окончания текущего периода расчета квоты CPU. Значение `softCpuLimit` не может быть больше, чем `hardCpuLimit`.
       * `hardCpuLimit` — жесткий лимит процессорного времени. При достижении этого лимита новые запросы будут поставлены в очередь.
     
       {% note info %}
     
       Если задан хотя бы один из параметров — `softCpuLimit` или `hardCpuLimit`, задайте также параметр `cpuQuotaPeriod`.
     
       {% endnote %}
     
       * `maxQueued` — максимальное число запросов в очереди. При достижении этого лимита новые запросы будут отклонены с ошибкой.
       * `schedulingPolicy` — [политика планирования запросов](../concepts/resource-groups.md#policy). Возможные значения:
         * `FAIR`
         * `WEIGHTED`
         * `WEIGHTED_FAIR`
         * `QUERY_PRIORITY`
     
         Если параметр не указан, действует политика `FAIR`.
     
       * `schedulingWeight` — вес группы, используемый в политиках планирования `WEIGHTED` и `WEIGHTED_FAIR`.
     
         Если параметр не указан, вес группы равен `1`.
     
       * `subGroups` — описания дочерних групп.
     
     * `selectors` — описание правил маршрутизации. Параметр `group` является обязательным.
       * `user` — имя пользователя, отправившего запрос, или регулярное выражение Java. Правило срабатывает, если имя пользователя соответствует регулярному выражению. Если параметр не указан, правило срабатывает для запросов любых пользователей.
       * `userGroup` — имя группы пользователя, отправившего запрос, или регулярное выражение Java для групп пользователей. Правило срабатывает, если имя группы пользователя соответствует регулярному выражению. Если параметр не указан, правило срабатывает для запросов пользователей любых групп.
       * `queryType` — тип запроса. Возможные значения:
         * `SELECT` — запросы `SELECT`.
         * `EXPLAIN` — запросы `EXPLAIN`, кроме `EXPLAIN ANALYZE`.
         * `DESCRIBE` — запросы `DESCRIBE`, `DESCRIBE INPUT` и `DESCRIBE OUTPUT`, а также запросы `SHOW` (например, `SHOW CATALOGS` или `SHOW SCHEMAS`).
         * `INSERT` — запросы `INSERT`, `CREATE TABLE AS` и `REFRESH MATERIALIZED VIEW`.
         * `MERGE` — запросы `MERGE`.
         * `DELETE` — запросы `DELETE`.
         * `ANALYZE` — запросы `ANALYZE`.
         * `DATA_DEFINITION` — запросы `CREATE`, `ALTER` и `DROP` для схем, таблиц, представлений и материализованных представлений, а также запросы управления подготовленными выражениями, правами доступа, сессиями и транзакциями.
         * `ALTER_TABLE_EXECUTE` — запросы вида `ALTER TABLE ... EXECUTE`.
     
       * `source` — имя источника запроса или регулярное выражение Java. Правило срабатывает, если имя источника запроса соответствует регулярному выражению. Если параметр не указан, правило срабатывает для запросов из любых источников.
       * `clientTags` — список тегов. Правило срабатывает, только если запрос содержит все указанные теги. Если параметр не указан, правило срабатывает для запросов с любыми тегами.
       * `group` — полное имя целевой ресурсной группы. Включает имена всех ее родительских групп, разделенных точками, начиная с корневой группы. В имени группы могут использоваться подстановки переменных в формате `${<имя_переменной>}`. Целевая группа не может иметь дочерних групп.
     
       {% note warning %}
     
       Запрос, не соответствующий ни одному заданному правилу, отклоняется с ошибкой. Чтобы этого не происходило, добавьте в конец описания правило без ограничивающих условий, содержащее только параметр `group`.
     
       {% endnote %}
     
     * `cpuQuotaPeriod` — период расчета квоты CPU для ресурсных групп. Задается как целое число секунд, минут или часов, например `140s`, `30m` или `1h`.
     
     Подробнее о дереве групп и правилах маршрутизации в разделе [Ресурсные группы в Managed Service for Trino](../concepts/resource-groups.md).

  1. Воспользуйтесь методом [Cluster.Update](../api-ref/Cluster/update.md) и выполните запрос, например с помощью [cURL](https://curl.se/):

     ```bash
     curl \
       --request PATCH \
       --header "Authorization: Bearer $IAM_TOKEN" \
       --url 'https://trino.api.cloud.yandex.net/managed-trino/v1/clusters/<идентификатор_кластера>'
       --data '@body.json'
     ```

     Идентификатор кластера можно получить со [списком кластеров](cluster-list.md#list-clusters) в каталоге.

  1. Убедитесь, что запрос был выполнен успешно, изучив [ответ сервера](../api-ref/Cluster/update.md#yandex.cloud.operation.Operation).

- gRPC API {#grpc-api}

  1. [Получите IAM-токен для аутентификации в API](../api-ref/authentication.md) и поместите токен в переменную среды окружения:

      ```bash
      export IAM_TOKEN="<IAM-токен>"
      ```

  1. Клонируйте репозиторий [cloudapi](https://github.com/yandex-cloud/cloudapi):
     
     ```bash
     cd ~/ && git clone --depth=1 https://github.com/yandex-cloud/cloudapi
     ```
     
     Далее предполагается, что содержимое репозитория находится в директории `~/cloudapi/`.

  1. Создайте файл `body.json` и добавьте в него следующее содержимое:

     ```json
     {
       "cluster_id": "<идентификатор_кластера>",
         "update_mask": {
           "paths": [
             <список_изменяемых_параметров>
           ]
         },
       "trino": {
         "resource_management": {
           "resource_groups": {
             "root_groups": [
               {
                 "name" : "<имя_ресурсной_группы>",
                 "soft_memory_limit" : "<лимит_использования_памяти>",
                 "soft_concurrency_limit" : "<мягкий_лимит_числа_запущенных_запросов>",
                 "hard_concurrency_limit" : "<жесткий_лимит_числа_запущенных_запросов>",
                 "soft_cpu_limit" : "<мягкий_лимит_процессорного_времени>",
                 "hard_cpu_limit" : "<жесткий_лимит_процессорного_времени>",
                 "max_queued" : "<лимит_числа_запросов_в_очереди>",
                 "scheduling_policy" : "<политика_планирования_запросов>",
                 "scheduling_weight" : "<вес_группы>",
                 "sub_groups": [
                   {
                     <Дочерняя_ресурсная_группа_1>
                     ...
                     "sub_groups" : [<список_дочерних_групп_следующих уровней>]
                   },
                   {
                     <Дочерняя_ресурсная_группа_2>
                     ...
                     "sub_groups" : [<список_дочерних_групп_следующих уровней>]
                   },
                   ...
                   {
                     <Дочерняя_ресурсная_группа_N>
                     ...
                     "sub_groups" : [<список_дочерних_групп_следующих уровней>]
                   }
                 ]
               },
               {
                 <Корневая_ресурсная_группа_2>
               },
               ...
               {
                 <Корневая_ресурсная_группа_N>
               }
             ],
             "selectors": [
               {
                 "user": "<регулярное_выражение_для_имен_пользователей>",
                 "user_group": "<регулярное_выражение_для_групп_пользователей>",
                 "query_type": "<тип_запроса>",
                 "source": "<регулярное_выражение_для_источников_запросов>",
                 "client_tags": ["<список_тегов>"],
                 "group": "<имя_ресурсной_группы>"
               },
               {
                 <Правило_маршрутизации_2> 
               },
               ...
               {
                 <Правило_маршрутизации_N>
               }
             ],
             "cpu_quota_period": "<период_расчета_квоты_CPU>"
           }
           ...
         },
       }
     }
     ```

     Где:

     * `cluster_id` — идентификатор кластера.

         Идентификатор кластера можно получить со [списком кластеров](cluster-list.md#list-clusters) в каталоге.

     * `update_mask` — перечень изменяемых параметров в виде массива строк `paths[]`.
         {% cut "Формат перечисления настроек" %}
         ```yaml
         "update_mask": {
           "paths": [
             "<настройка_1>",
             "<настройка_2>",
             ...
             "<настройка_N>"
           ]
         }
         ```
         {% endcut %}

         {% note warning %}

         При изменении кластера все параметры изменяемого объекта, которые не были явно переданы в запросе, будут переопределены на значения по умолчанию. Чтобы избежать этого, перечислите настройки, которые вы хотите изменить, в параметре `update_mask`.

         {% endnote %}

     * `root_groups` — описание дерева ресурсных групп. Параметры `name`, `hard_concurrency_limit` и `max_queued` являются обязательными.
       * `name` — имя группы.
     
         Имя группы может представлять собой шаблон, использующий подстановки переменных в формате `${<имя_переменной>}`. Имя-шаблон может содержать следующие виды переменных:
         * Встроенные: `USER` — имя пользователя, `SOURCE` — источник запроса.
         * Пользовательские: объявляются в параметрах правил маршрутизации `user`, `user_group` и `source`.
     
         При маршрутизации запросов Managed Service for Trino будет создавать экземпляры группы с динамически сформированными именами.
     
       * `soft_memory_limit` — максимальный объем доступной памяти, который может использоваться группой. При достижении этого лимита новые запросы будут поставлены в очередь. Значение `soft_memory_limit` может задаваться одним из способов:
         * В процентах от общего объема доступной памяти, например `10%`.
         * Как абсолютное значение объема памяти, например `1GB`. Можно использовать один из следующих суффиксов: `B`, `kB`, `MB`, `GB`, `TB`, `PB`.
       * `soft_concurrency_limit` — мягкий лимит на число запущенных запросов. При достижении этого лимита новые запросы будут запускаться в группе, только если соседние группы не могут принимать запросы или превысили свои мягкие лимиты. В противном случае новые запросы будут поставлены в очередь.
       * `hard_concurrency_limit` — максимальное число запущенных запросов. При достижении этого лимита новые запросы будут поставлены в очередь.
       * `soft_cpu_limit` — мягкий лимит процессорного времени. При достижении этого лимита значение `hard_concurrency_limit` будет снижено до окончания текущего периода расчета квоты CPU. Значение `soft_cpu_limit` не может быть больше, чем `hard_cpu_limit`.
       * `hard_cpu_limit` — жесткий лимит процессорного времени. При достижении этого лимита новые запросы будут поставлены в очередь.
     
       {% note info %}
     
       Если задан хотя бы один из параметров — `soft_cpu_limit` или `hard_cpu_limit`, задайте также параметр `cpu_quota_period`.
     
       {% endnote %}
     
       * `max_queued` — максимальное число запросов в очереди. При достижении этого лимита новые запросы будут отклонены с ошибкой.
       * `scheduling_policy` — [политика планирования запросов](../concepts/resource-groups.md#policy). Возможные значения:
         * `FAIR`
         * `WEIGHTED`
         * `WEIGHTED_FAIR`
         * `QUERY_PRIORITY`
     
         Если параметр не указан, действует политика `FAIR`.
     
       * `scheduling_weight` — вес группы, используемый в политиках планирования `WEIGHTED` и `WEIGHTED_FAIR`.
     
         Если параметр не указан, вес группы равен `1`.
     
       * `sub_groups` — описания дочерних групп.
     
     * `selectors` — описание правил маршрутизации. Параметр `group` является обязательным.
       * `user` — имя пользователя, отправившего запрос, или регулярное выражение Java. Правило срабатывает, если имя пользователя соответствует регулярному выражению. Если параметр не указан, правило срабатывает для запросов любых пользователей.
       * `user_group` — имя группы пользователя, отправившего запрос, или регулярное выражение Java для групп пользователей. Правило срабатывает, если имя группы пользователя соответствует регулярному выражению. Если параметр не указан, правило срабатывает для запросов пользователей любых групп.
       * `query_type` — тип запроса. Возможные значения:
         * `SELECT` — запросы `SELECT`.
         * `EXPLAIN` — запросы `EXPLAIN`, кроме `EXPLAIN ANALYZE`.
         * `DESCRIBE` — запросы `DESCRIBE`, `DESCRIBE INPUT` и `DESCRIBE OUTPUT`, а также запросы `SHOW` (например, `SHOW CATALOGS` или `SHOW SCHEMAS`).
         * `INSERT` — запросы `INSERT`, `CREATE TABLE AS` и `REFRESH MATERIALIZED VIEW`.
         * `MERGE` — запросы `MERGE`.
         * `DELETE` — запросы `DELETE`.
         * `ANALYZE` — запросы `ANALYZE`.
         * `DATA_DEFINITION` — запросы `CREATE`, `ALTER` и `DROP` для схем, таблиц, представлений и материализованных представлений, а также запросы управления подготовленными выражениями, правами доступа, сессиями и транзакциями.
         * `ALTER_TABLE_EXECUTE` — запросы вида `ALTER TABLE ... EXECUTE`.
     
       * `source` — имя источника запроса или регулярное выражение Java. Правило срабатывает, если имя источника запроса соответствует регулярному выражению. Если параметр не указан, правило срабатывает для запросов из любых источников.
       * `client_tags` — список тегов. Правило срабатывает, только если запрос содержит все указанные теги. Если параметр не указан, правило срабатывает для запросов с любыми тегами.
       * `group` — полное имя целевой ресурсной группы. Включает имена всех ее родительских групп, разделенных точками, начиная с корневой группы. В имени группы могут использоваться подстановки переменных в формате `${<имя_переменной>}`. Целевая группа не может иметь дочерних групп.
     
       {% note warning %}
     
       Запрос, не соответствующий ни одному заданному правилу, отклоняется с ошибкой. Чтобы этого не происходило, добавьте в конец описания правило без ограничивающих условий, содержащее только параметр `group`.
     
       {% endnote %}
     
     * `cpu_quota_period` — период расчета квоты CPU для ресурсных групп. Задается как целое число секунд, минут или часов, например `140s`, `30m` или `1h`.
     
     Подробнее о дереве групп и правилах маршрутизации в разделе [Ресурсные группы в Managed Service for Trino](../concepts/resource-groups.md).

  1. Воспользуйтесь вызовом [ClusterService.Update](../api-ref/grpc/Cluster/update.md) и выполните запрос, например с помощью [gRPCurl](https://github.com/fullstorydev/grpcurl):

     ```bash
     grpcurl \
       -format json \
       -import-path ~/cloudapi/ \
       -import-path ~/cloudapi/third_party/googleapis/ \
       -proto ~/cloudapi/yandex/cloud/trino/v1/cluster_service.proto \
       -rpc-header "Authorization: Bearer $IAM_TOKEN" \
       -d @ \
       trino.api.cloud.yandex.net:443 \
       yandex.cloud.trino.v1.ClusterService.Update \
       < body.json
     ```

  1. Убедитесь, что запрос был выполнен успешно, изучив [ответ сервера](../api-ref/grpc/Cluster/update.md#yandex.cloud.operation.Operation).

{% endlist %}

## Удалить конфигурацию ресурсных групп {#delete}

{% list tabs group=instructions %}

- Консоль управления {#console}

  1. В [консоли управления](https://kz.console.yandex.cloud) перейдите в нужный каталог.
  1. Перейдите в сервис **Managed Service for&nbsp;Trino**.
  1. Нажмите на имя нужного кластера.
  1. Перейдите в блок **Управление ресурсами**.
  1. Чтобы удалить ненужные ресурсные группы:
     1. В строке ресурсной группы, которую вы хотите удалить, нажмите на значок ![trash-bin](../../_assets/console-icons/trash-bin.svg).
     1. (Опционально) Удалите другие ресурсные группы аналогичным образом.
  1. Чтобы удалить ненужные правила маршрутизации:
     1. В строке правила, которое вы хотите удалить, нажмите на значок ![trash-bin](../../_assets/console-icons/trash-bin.svg).
     1. (Опционально) Удалите другие правила маршрутизации аналогичным образом.
  1. Нажмите кнопку **Сохранить изменения**.

- CLI {#cli}

  Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), [установите и инициализируйте его](../../cli/quickstart.md#install).

  По умолчанию используется каталог, указанный при [создании](../../cli/operations/profile/profile-create.md) профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду `yc config set folder-id <идентификатор_каталога>`. Также для любой команды вы можете указать другой каталог с помощью параметров `--folder-name` или `--folder-id`. Если вы обращаетесь к ресурсу по имени, поиск будет выполнен в каталоге по умолчанию. Если вы обращаетесь к ресурсу по идентификатору, поиск будет выполнен глобально — во всех каталогах с учетом прав доступа.

  Чтобы удалить все ресурсные группы и правила маршрутизации, выполните команду:

  ```bash
  yc managed-trino cluster remove-resource-groups <имя_или_идентификатор_кластера>
  ```

  Идентификатор и имя кластера можно запросить со [списком кластеров в каталоге](cluster-list.md#list-clusters).

- Terraform {#tf}

  1. Откройте актуальный конфигурационный файл Terraform с планом инфраструктуры.
  
      Инструкция по созданию файла описана в разделе [Создание кластера](cluster-create.md).
  
  1. Чтобы удалить все ресурсные группы и правила маршрутизации, удалите из описания кластера параметр `resource_groups`.

  1. Проверьте корректность настроек.
  
      1. В командной строке перейдите в каталог, в котором расположены актуальные конфигурационные файлы Terraform с планом инфраструктуры.
      1. Выполните команду:
      
         ```bash
         terraform validate
         ```
      
         Если в файлах конфигурации есть ошибки, Terraform на них укажет.
  
  1. Подтвердите изменение ресурсов.
  
      1. Выполните команду для просмотра планируемых изменений:
      
         ```bash
         terraform plan
         ```
      
         Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
      
      1. Если вас устраивают планируемые изменения, внесите их:
         1. Выполните команду:
      
            ```bash
            terraform apply
            ```
      
         1. Подтвердите изменение ресурсов.
         1. Дождитесь завершения операции.

- REST API {#api}

    1. [Получите IAM-токен для аутентификации в API](../api-ref/authentication.md) и поместите токен в переменную среды окружения:

        ```bash
        export IAM_TOKEN="<IAM-токен>"
        ```

    1. Создайте файл `body.json` и добавьте в него следующее содержимое:

        ```json
        {
          "updateMask": "trino.resourceManagement.resourceGroups",
          "trino": {
            "resourceManagement": {
              "resourceGroups": {}
            }
          }
        }
        ```

        Где:

        * `updateMask` — перечень изменяемых параметров в строку через запятую.

            {% note warning %}

            При изменении кластера все параметры изменяемого объекта, которые не были явно переданы в запросе, будут переопределены на значения по умолчанию. Чтобы избежать этого, перечислите настройки, которые вы хотите изменить, в параметре `updateMask`.

            {% endnote %}

        * `resourceGroups` — описание ресурсных групп и правил маршрутизации.

    1. Воспользуйтесь методом [Cluster.Update](../api-ref/Cluster/update.md) и выполните запрос, например с помощью [cURL](https://curl.se/):

        ```bash
        curl \
          --request PATCH \
          --header "Authorization: Bearer $IAM_TOKEN" \
          --url 'https://trino.api.cloud.yandex.net/managed-trino/v1/clusters/<идентификатор_кластера>'
          --data '@body.json'
        ```

        Идентификатор кластера можно получить со [списком кластеров](cluster-list.md#list-clusters) в каталоге.

    1. Убедитесь, что запрос был выполнен успешно, изучив [ответ сервера](../api-ref/Cluster/update.md#yandex.cloud.operation.Operation).

- gRPC API {#grpc-api}

  1. [Получите IAM-токен для аутентификации в API](../api-ref/authentication.md) и поместите токен в переменную среды окружения:

      ```bash
      export IAM_TOKEN="<IAM-токен>"
      ```

  1. Клонируйте репозиторий [cloudapi](https://github.com/yandex-cloud/cloudapi):
     
     ```bash
     cd ~/ && git clone --depth=1 https://github.com/yandex-cloud/cloudapi
     ```
     
     Далее предполагается, что содержимое репозитория находится в директории `~/cloudapi/`.

  1. Создайте файл `body.json` и добавьте в него следующее содержимое:

      ```json
      {
        "cluster_id": "<идентификатор_кластера>",
        "update_mask": {
          "paths": [
            "trino.resource_management.resource_groups"
          ]
        },
        "trino": {
          "resource_management": {
            "resource_groups": {}
          }
        }
      }
      ```

      Где:

      * `cluster_id` — идентификатор кластера.
          
          Идентификатор кластера можно получить со [списком кластеров](cluster-list.md#list-clusters) в каталоге.

      * `update_mask` — перечень изменяемых параметров в виде массива строк `paths[]`.

          {% cut "Формат перечисления настроек" %}

          ```yaml
          "update_mask": {
            "paths": [
              "<настройка_1>",
              "<настройка_2>",
              ...
              "<настройка_N>"
            ]
          }
          ```

          {% endcut %}

          {% note warning %}

          При изменении кластера все параметры изменяемого объекта, которые не были явно переданы в запросе, будут переопределены на значения по умолчанию. Чтобы избежать этого, перечислите настройки, которые вы хотите изменить, в параметре `update_mask`.

          {% endnote %}

      * `resource_groups` — описание ресурсных групп и правил маршрутизации.

  1. Воспользуйтесь вызовом [ClusterService.Update](../api-ref/grpc/Cluster/update.md) и выполните запрос, например с помощью [gRPCurl](https://github.com/fullstorydev/grpcurl):

      ```bash
      grpcurl \
        -format json \
        -import-path ~/cloudapi/ \
        -import-path ~/cloudapi/third_party/googleapis/ \
        -proto ~/cloudapi/yandex/cloud/trino/v1/cluster_service.proto \
        -rpc-header "Authorization: Bearer $IAM_TOKEN" \
        -d @ \
        trino.api.cloud.yandex.net:443 \
        yandex.cloud.trino.v1.ClusterService.Update \
        < body.json
      ```

  1. Убедитесь, что запрос был выполнен успешно, изучив [ответ сервера](../api-ref/grpc/Cluster/update.md#yandex.cloud.operation.Operation).

{% endlist %}

## Пример конфигурации ресурсных групп в кластере Managed Service for Trino {#example}

В примере используются следующие ресурсные группы:

* `global` — корневая группа, задающая общие лимиты `hardConcurrencyLimit` и `maxQueued`. Группа `global` содержит дочерние группы `adm`, `bi`, `etl` и `adhoc`.

* `adm` — группа для запросов администраторов и запросов с типом `DATA_DEFINITION`. Благодаря высокому значению `schedulingWeight` снижается вероятность блокировки этих запросов пользовательской нагрузкой.

* `bi` — группа для запросов систем бизнес-аналитики. В этой группе используется лимит `softMemoryLimit`, чтобы запросы не занимали слишком много памяти и не вытесняли другие типы запросов. Внутри этой группы для каждого инструмента создается экземпляр дочерней группы с динамически сформированным именем. Внутри группы каждого инструмента создаются экземпляры дочерних групп для каждого пользователя. Это задает отдельный лимит для каждого инструмента и пользователя. В результате ограничивается влияние запросов от разных пользователей и разных инструментов друг на друга.

* `etl` — группа для запросов извлечения, преобразования и загрузки данных. В этой группе используются лимиты `softCpuLimit` и `hardCpuLimit`, чтобы ограничить потребление процессорного времени запросами.

* `adhoc` — группа для интерактивных пользовательских запросов. Внутри этой группы для каждого пользователя создается экземпляр дочерней группы с динамически сформированным именем. Это задает отдельный лимит для каждого пользователя, что ограничивает влияние запросов от разных пользователей друг на друга.

Между группами `adm`, `bi`, `etl` и `adhoc` запросы распределяются в соответствии с политикой планирования `weighted_fair`. Для группы `adhoc` не указан параметр `schedulingWeight`, поэтому используется значение по умолчанию — `1`. Для групп `bi` и `adhoc` не указана политика планирования, поэтому между их дочерними группами запросы распределяются в соответствии с политикой по умолчанию `fair`.

Для направления запросов в группы используются следующие правила маршрутизации:

1. Запросы пользователей из группы `admins` направляются в ресурсную группу `global.adm`.

1. Запросы с тегом `etl_job` направляются в группу `global.etl`.

1. Запросы с типом `DATA_DEFINITION` направляются в ресурсную группу `global.adm`. Благодаря этому запросы для вызова процедуры `system.runtime.kill_query()` не будут ожидать завершения других пользовательских запросов.

1. Запросы типа `SELECT` от источника с именем вида `jdbc#(?<toolname>[^#]+)` направляются в группу-шаблон `global.bi.${toolname}.${USER}`. Например, запрос пользователя `bob` от источника `jdbc#grafana` будет направлен в экземпляр группы с именем `global.bi.grafana.bob`.

1. Все остальные запросы направляются в группу-шаблон `global.adhoc.${USER}`. Например, запрос пользователя `bob` будет направлен в экземпляр группы с именем `global.adhoc.bob`.

{% list tabs group=instructions %}

- CLI {#cli}

  Файл `resource-groups.json` этого примера:

  ```json
  {
    "rootGroups": [
      {
        "name": "global",
        "hardConcurrencyLimit": 20,
        "maxQueued": 200,
        "schedulingPolicy": "weighted_fair",
        "subGroups": [
          {
            "name": "adm",
            "hardConcurrencyLimit": 5,
            "maxQueued": 50,
            "schedulingWeight": 5
          },
          {
            "name": "bi",
            "hardConcurrencyLimit": 10,
            "softMemoryLimit": "20%",
            "maxQueued": 100,
            "schedulingWeight": 3,
            "subGroups": [
              {
                "name": "${toolname}",
                "hardConcurrencyLimit": 5,
                "maxQueued": 50,
                "subGroups": [
                  {
                    "name": "${USER}",
                    "hardConcurrencyLimit": 2,
                    "maxQueued": 20
                  }
                ]
              }
            ]
          },
          {
            "name": "etl",
            "hardConcurrencyLimit": 5,
            "softCpuLimit": "20s",
            "hardCpuLimit": "40s",
            "maxQueued": 50,
            "schedulingWeight": 1
          },
          {
            "name": "adhoc",
            "hardConcurrencyLimit": 5,
            "maxQueued": 100,
            "subGroups": [
              {
                "name": "${USER}",
                "hardConcurrencyLimit": 2,
                "maxQueued": 20
              }
            ]
          }
        ]
      }
    ],
    "selectors": [
      {
        "userGroup": "admins",
        "group": "global.adm"
      },
      {
        "clientTags": ["etl_job"],
        "group": "global.etl"
      },
      {
        "queryType": "DATA_DEFINITION",
        "group": "global.adm"
      },
      {
        "source": "jdbc#(?<toolname>[^#]+)",
        "queryType": "SELECT",
        "group": "global.bi.${toolname}.${USER}"
      },
      {
        "group": "global.adhoc.${USER}"
      }
    ],
    "cpuQuotaPeriod": "1m"
  }
  ```

- Terraform {#tf}

  Файл `resource-groups.json` этого примера:

  ```json
  {
    "rootGroups": [
      {
        "name": "global",
        "hardConcurrencyLimit": 20,
        "maxQueued": 200,
        "schedulingPolicy": "weighted_fair",
        "subGroups": [
          {
            "name": "adm",
            "hardConcurrencyLimit": 5,
            "maxQueued": 50,
            "schedulingWeight": 5
          },
          {
            "name": "bi",
            "hardConcurrencyLimit": 10,
            "softMemoryLimit": "20%",
            "maxQueued": 100,
            "schedulingWeight": 3,
            "subGroups": [
              {
                "name": "${toolname}",
                "hardConcurrencyLimit": 5,
                "maxQueued": 50,
                "subGroups": [
                  {
                    "name": "${USER}",
                    "hardConcurrencyLimit": 2,
                    "maxQueued": 20
                  }
                ]
              }
            ]
          },
          {
            "name": "etl",
            "hardConcurrencyLimit": 5,
            "softCpuLimit": "20s",
            "hardCpuLimit": "40s",
            "maxQueued": 50,
            "schedulingWeight": 1
          },
          {
            "name": "adhoc",
            "hardConcurrencyLimit": 5,
            "maxQueued": 100,
            "subGroups": [
              {
                "name": "${USER}",
                "hardConcurrencyLimit": 2,
                "maxQueued": 20
              }
            ]
          }
        ]
      }
    ],
    "selectors": [
      {
        "userGroup": "admins",
        "group": "global.adm"
      },
      {
        "clientTags": ["etl_job"],
        "group": "global.etl"
      },
      {
        "queryType": "DATA_DEFINITION",
        "group": "global.adm"
      },
      {
        "source": "jdbc#(?<toolname>[^#]+)",
        "queryType": "SELECT",
        "group": "global.bi.${toolname}.${USER}"
      },
      {
        "group": "global.adhoc.${USER}"
      }
    ],
    "cpuQuotaPeriod": "1m"
  }
  ```

- REST API {#api}

  Файл `body.json` этого примера:

  ```json
  {
    "updateMask": "trino.resourceManagement.resourceGroups",
    "trino": {
      "resourceManagement": {
        "resourceGroups": {
          "rootGroups": [
            {
              "name": "global",
              "hardConcurrencyLimit": "20",
              "maxQueued": "200",
              "schedulingPolicy": "weighted_fair",
              "subGroups": [
                {
                  "name": "adm",
                  "hardConcurrencyLimit": "5",
                  "maxQueued": "50",
                  "schedulingWeight": "5"
                },
                {
                  "name": "bi",
                  "hardConcurrencyLimit": "10",
                  "softMemoryLimit": "20%",
                  "maxQueued": "100",
                  "schedulingWeight": "3",
                  "subGroups": [
                    {
                      "name": "${toolname}",
                      "hardConcurrencyLimit": "5",
                      "maxQueued": "50",
                      "subGroups": [
                        {
                          "name": "${USER}",
                          "hardConcurrencyLimit": "2",
                          "maxQueued": "20"
                        }
                      ]
                    }
                  ]
                },
                {
                  "name": "etl",
                  "hardConcurrencyLimit": "5",
                  "softCpuLimit": "20s",
                  "hardCpuLimit": "40s",
                  "maxQueued": "50",
                  "schedulingWeight": "1"
                },
                {
                  "name": "adhoc",
                  "hardConcurrencyLimit": "5",
                  "maxQueued": "100",
                  "subGroups": [
                    {
                      "name": "${USER}",
                      "hardConcurrencyLimit": "2",
                      "maxQueued": "20"
                    }
                  ]
                }
              ]
            }
          ],
          "selectors": [
            {
              "userGroup": "admins",
              "group": "global.adm"
            },
            {
              "clientTags": ["etl_job"],
              "group": "global.etl"
            },
            {
              "queryType": "DATA_DEFINITION",
              "group": "global.adm"
            },
            {
              "source": "jdbc#(?<toolname>[^#]+)",
              "queryType": "SELECT",
              "group": "global.bi.${toolname}.${USER}"
            },
            {
              "group": "global.adhoc.${USER}"
            }
          ],
          "cpuQuotaPeriod": "1m"
        }
      }
    }
  }
  ```

- gRPC API {#grpc-api}

  Файл `body.json` этого примера:

  ```json
  {
    "cluster_id": "<идентификатор_кластера>",
    "update_mask": {
      "paths": [
        "trino.resource_management.resource_groups"
      ]
    },
    "trino": {
      "resource_management": {
        "resource_groups": {
          "root_groups": [
            {
              "name": "global",
              "hard_concurrency_limit": "20",
              "max_queued": "200",
              "scheduling_policy": "weighted_fair",
              "sub_groups": [
                {
                  "name": "adm",
                  "hard_concurrency_limit": "5",
                  "max_queued": "50",
                  "scheduling_weight": "5"
                },
                {
                  "name": "bi",
                  "hard_concurrency_limit": "10",
                  "soft_memory_limit": "20%",
                  "max_queued": "100",
                  "scheduling_weight": "3",
                  "sub_groups": [
                    {
                      "name": "${toolname}",
                      "hard_concurrency_limit": "5",
                      "max_queued": "50",
                      "sub_groups": [
                        {
                          "name": "${USER}",
                          "hard_concurrency_limit": "2",
                          "max_queued": "20"
                        }
                      ]
                    }
                  ]
                },
                {
                  "name": "etl",
                  "hard_concurrency_limit": "5",
                  "soft_cpu_limit": "20s",
                  "hard_cpu_limit": "40s",
                  "max_queued": "50",
                  "scheduling_weight": "1"
                },
                {
                  "name": "adhoc",
                  "hard_concurrency_limit": "5",
                  "max_queued": "100",
                  "sub_groups": [
                    {
                      "name": "${USER}",
                      "hard_concurrency_limit": "2",
                      "max_queued": "20"
                    }
                  ]
                }
              ]
            }
          ],
          "selectors": [
            {
              "user_group": "admins",
              "group": "global.adm"
            },
            {
              "client_tags": ["etl_job"],
              "group": "global.etl"
            },
            {
              "query_type": "DATA_DEFINITION",
              "group": "global.adm"
            },
            {
              "source": "jdbc#(?<toolname>[^#]+)",
              "query_type": "SELECT",
              "group": "global.bi.${toolname}.${USER}"
            },
            {
              "group": "global.adhoc.${USER}"
            }
          ],
          "cpu_quota_period": "1m"
        }
      }
    }
  }
  ```

{% endlist %}