Trino на Kubernetes с Helm#

Kubernetes — это платформа оркестрации контейнеров, которая позволяет развёртывать Trino и другие приложения воспроизводимым образом на различных типах инфраструктуры. Это может варьироваться от развёртывания на вашем ноутбуке с использованием инструментов, таких как kind, до запуска в управляемых Kubernetes-сервисах в облаке, таких как Amazon Elastic Kubernetes Service, Google Kubernetes Engine, Azure Kubernetes Service и других.

Самый быстрый способ запустить Trino в Kubernetes — использовать Trino Helm chart. Helm — это пакетный менеджер для Kubernetes-приложений, который упрощает установку и управление версиями за счёт шаблонизации конфигурационных файлов Kubernetes. Это позволяет вам прототипировать на локальном или on-premise кластере и использовать тот же механизм развёртывания для деплоя в облако с возможностью масштабирования.

Требования#

Запуск Trino используя Helm#

Выполните следующие команды на системе, где установлены helm и kubectl и настроено подключение к вашему работающему Kubernetes-кластеру:

  1. Убедитесь, что kubectl указывает на правильный кластер, выполнив команду:

    kubectl cluster-info
    

    Вы должны увидеть вывод, содержащий корректный адрес Kubernetes control plane.

  2. Добавьте репозиторий Trino Helm chart в Helm, если вы ещё этого не сделали. Это сообщает Helm, где искать чарты Trino. Вы можете назвать репозиторий как угодно, хорошим вариантом является trino.

    helm repo add trino https://trinodb.github.io/charts
    
  3. Установите Trino в Kubernetes-кластер с помощью Helm chart. Начните с выполнения команды install, чтобы использовать значения по умолчанию и создать кластер с именем example-trino-cluster.

    helm install example-trino-cluster trino/trino
    

    Это создаёт конфигурационные файлы Kubernetes путём подстановки параметров в шаблоны helm. Helm chart содержит default values, которые можно переопределить с помощью YAML-файла для изменения настроек по умолчанию.

    1. (Опционально) Чтобы переопределить значения по умолчанию, создайте собственную YAML-конфигурацию, чтобы задать параметры вашего развёртывания. Чтобы выполнить команду install с использованием example.yaml, добавьте параметр f в вашу команду install. Обязательно следуйте best practices и соглашениям об именовании для ваших конфигурационных файлов.

      helm install -f example.yaml example-trino-cluster trino/trino
      

    Вы должны увидеть следующий вывод:

    NAME: example-trino-cluster
    LAST DEPLOYED: Tue Sep 13 14:12:09 2022
    NAMESPACE: default
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None
    NOTES:
    Get the application URL by running these commands:
      export POD_NAME=$(kubectl get pods --namespace default --selector "app.kubernetes.io/name=trino,app.kubernetes.io/instance=example-trino-cluster,app.kubernetes.io/component=coordinator" --output name)
      echo "Visit http://127.0.0.1:8080 to use your application"
      kubectl port-forward $POD_NAME 8080:8080
    

    Этот вывод зависит от вашей конфигурации и имени кластера. Например, порт 8080 задаётся параметром .service.port в example.yaml.

  4. Выполните следующую команду, чтобы убедиться, что все pods, deployments и services работают корректно.

    kubectl get all
    

    Ожидается вывод, показывающий запущенные pods, deployments и replica sets. Хорошим индикатором корректной работы является то, что все pods имеют статус готовности в колонке READY.

    NAME                                               READY   STATUS    RESTARTS   AGE
    pod/example-trino-cluster-coordinator-bfb74c98d-rnrxd   1/1     Running   0          161m
    pod/example-trino-cluster-worker-76f6bf54d6-hvl8n       1/1     Running   0          161m
    pod/example-trino-cluster-worker-76f6bf54d6-tcqgb       1/1     Running   0          161m
    
    NAME                       TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
    service/example-trino-cluster   ClusterIP   10.96.25.35   <none>        8080/TCP   161m
    
    NAME                                           READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/example-trino-cluster-coordinator   1/1     1            1           161m
    deployment.apps/example-trino-cluster-worker        2/2     2            2           161m
    
    NAME                                                     DESIRED   CURRENT   READY   AGE
    replicaset.apps/example-trino-cluster-coordinator-bfb74c98d   1         1         1       161m
    replicaset.apps/example-trino-cluster-worker-76f6bf54d6       2         2         2       161m
    

    Вывод показывает запущенные pods. Они включают непосредственно контейнеры Trino. Чтобы лучше понять этот вывод, ознакомьтесь со следующими ресурсами:

    1. kubectl get command reference.

    2. kubectl get command example.

    3. Debugging Kubernetes reference.

  5. Если все pods, deployments и replica sets запущены и находятся в состоянии ready, значит Trino успешно развернут.

Note

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

Выполнение запросов#

Pods с контейнерами Trino работают во внутренней приватной сети Kubernetes. Чтобы получить к ним доступ, в частности к coordinator, необходимо создать туннель между pod coordinator и вашим компьютером. Это можно сделать, выполнив команды, сгенерированные при установке.

  1. Создайте туннель от клиента к сервису coordinator.

    kubectl port-forward svc/trino 8080:8080
    

    Теперь вы можете подключиться к coordinator Trino по адресу http://localhost:8080.

  2. Для подключения к Trino вы можете использовать command-line interface, JDBC client или любой из других клиентов. В данном примере установите command-line interface и подключитесь к Trino в новой консольной сессии.

    trino --server http://localhost:8080
    
  3. Используя примерные данные в каталоге tpch, выполните запрос к таблице nation, используя схему tiny:

    trino> select count(*) from tpch.tiny.nation;
     _col0
    -------
      25
    (1 row)
    
    Query 20181105_001601_00002_e6r6y, FINISHED, 1 node
    Splits: 21 total, 21 done (100.00%)
    0:06 [25 rows, 0B] [4 rows/s, 0B/s]
    

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

  4. Когда закончите работу, введите команду quit в CLI.

  5. Закройте туннель к pod coordinator. Он доступен только пока работает процесс kubectl, поэтому вы можете просто завершить процесс kubectl, который выполняет проброс порта. В большинстве случаев это означает нажатие CTRL + C в терминале, где запущена команда port-forward.

Configuration#

Helm chart использует Trino container image. Docker image уже содержит конфигурацию по умолчанию для быстрого старта, а также некоторые каталоги, позволяющие исследовать Trino. Kubernetes позволяет воспроизвести traditional deployment путём задания конфигурации в YAML-файлах. Важно понимать, как настраиваются такие файлы, как конфигурация Trino, JVM и различные catalog properties, прежде чем изменять значения.

Creating your own YAML configuration#

При использовании собственной YAML-конфигурации Kubernetes вы переопределяете только указанные значения. Остальные параметры используют значения по умолчанию. Добавьте файл example.yaml со следующей конфигурацией:

image:
  tag: "latest"
server:
  workers: 3
coordinator:
  jvm:
    maxHeapSize: "8G"
worker:
  jvm:
    maxHeapSize: "8G"

Эти значения выше значений по умолчанию и позволяют Trino использовать больше памяти и выполнять более ресурсоёмкие запросы. Если значения слишком высокие, Kubernetes может не суметь запланировать некоторые pods Trino в зависимости от других приложений, развернутых в этом кластере, и размера узлов кластера.

  1. .image.tag установлен в текущую версию, latest. Установите это значение, если вам необходимо использовать конкретную версию Trino. Значение по умолчанию — latest, что не рекомендуется. Использование latest приведёт к публикации новой версии Trino при каждом релизе и последующем развертывании в Kubernetes.

  2. .server.workers установлен в 3. Это значение задаёт количество workers — в данном случае разворачивается один coordinator и три worker-узла.

  3. .coordinator.jvm.maxHeapSize установлен в 8GB. Это задаёт максимальный размер heap в JVM координатора. См. JVM config.

  4. .worker.jvm.maxHeapSize установлен в 8GB. Это задаёт максимальный размер heap в JVM worker-узлов. См. JVM config.

Warning

Некоторые параметры памяти требуют аккуратной настройки, так как установка значений вне допустимого диапазона максимального размера heap может привести к ошибке запуска Trino. См. предупреждения в Resource management properties.

См. полный список параметров, которые можно переопределить в Helm chart.

Note

Хотя в этом документе используется имя example.yaml для обозначения файла конфигурации Kubernetes, рекомендуется использовать понятные и осмысленные имена для кластера и развертывания. Например, cluster-example-trino-etl.yaml может обозначать развертывание Trino для кластера, используемого преимущественно для extract-transform-load запросов, развернутого в Kubernetes-кластере example. См. Configuration Best Practices для получения дополнительных рекомендаций по настройке развертываний в Kubernetes.

Добавление каталогов#

Частый сценарий использования — добавление пользовательских каталогов. Это можно сделать, добавив значения в свойство catalogs в файле example.yaml.

catalogs:
  lakehouse: |-
    connector.name=iceberg
    hive.metastore.uri=thrift://example.net:9083
  rdbms: |-
    connector.name=postgresql
    connection-url=jdbc:postgresql://example.net:5432/database
    connection-user=root
    connection-password=secret
  tpch: |-
    connector.name=tpch
    tpch.splits-per-node=4

Это добавляет каталоги lakehouse и rdbms в конфигурацию развертывания Kubernetes.

Running a local Kubernetes cluster with kind#

Для локальных развертываний вы можете использовать kind (Kubernetes in Docker). Выполните следующие шаги, чтобы запустить kind в вашей системе.

  1. kind работает поверх Docker, поэтому сначала проверьте, установлен ли Docker:

    docker --version
    

    Если эта команда завершится ошибкой, установите Docker, следуя инструкциям по установке Docker.

  2. Установите kind, следуя инструкциям по установке kind.

  3. Запустите Kubernetes-кластер в kind, выполнив команду:

    kind create cluster --name trino
    

    Note

    Параметр name является необязательным, но используется для демонстрации того, как namespace применяется в последующих командах. По умолчанию имя кластера — kind, если параметр не указан. Используйте trino, чтобы явно обозначить приложение в этом кластере.

  4. Убедитесь, что kubectl работает с правильным Kubernetes-кластером.

    kubectl cluster-info --context kind-trino
    

    Если у вас уже настроено несколько Kubernetes-кластеров в ~/.kube/config, необходимо передавать параметр context в команды kubectl, чтобы работать с локальным кластером kind. kubectl использует context по умолчанию, если этот параметр не указан. Обратите внимание, что context — это имя кластера с добавленным префиксом kind-. Теперь вы можете посмотреть все Kubernetes-объекты, запущенные в вашем кластере kind.

  5. Настройте Trino, следуя шагам Запуск Trino используя Helm. При выполнении команды kubectl get all добавьте параметр context.

    kubectl get all --context kind-trino
    
  6. Выполните несколько запросов, следуя шагам в разделе Executing queries.

  7. После завершения работы с кластером kind вы можете удалить кластер.

    kind delete cluster -n trino
    

Очистка#

Чтобы удалить Trino из Kubernetes-кластера, выполните следующую команду:

helm uninstall my-trino-cluster

Ожидается следующий вывод:

release "my-trino-cluster" uninstalled

Чтобы убедиться, что всё выполнено успешно, вы можете выполнить эту команду kubectl, чтобы проверить, что не осталось Kubernetes-объектов, связанных с кластером Trino.

kubectl get all