Сборка offline Docker-образа SPYT
При обычном развёртывании SPYT дистрибутив Spark и вспомогательные артефакты скачиваются из интернета (архив Apache, Maven Central), а управляющий образ — из реестра ghcr.io. В закрытых средах без доступа в интернет сделать это нельзя.
Чтобы развернуть SPYT в таких условиях, используется offline-образ — самодостаточный Docker-образ ghcr.io/ytsaurus/spyt:<spyt-version>-pyspark-<spark-version>, внутрь которого уже вложены нужная сборка SPYT и дистрибутив Spark. При развёртывании такому образу доступ в интернет не нужен: все артефакты берутся из него самого.
Важно
Версия Spark должна быть не ниже 3.4.0 — только для таких версий дистрибутив вкладывается в образ. Для более старых версий Spark offline-образ не поддерживается.
Как собрать образ
Сборка выполняется из репозитория ytsaurus-spyt на нужном релизном теге. Сначала склонируйте репозиторий:
git clone https://github.com/ytsaurus/ytsaurus-spyt.git
cd ytsaurus-spyt
В составе репозитория есть вспомогательный скрипт tools/release/build_offline_image.sh, который выполняет все шаги сборки. Запускайте его из корня склонированного репозитория (либо укажите путь к нему флагом --repo <dir>).
Например, чтобы собрать образ для SPYT 2.9.2 и Spark 3.5.8:
tools/release/build_offline_image.sh --spyt-version 2.9.2 --spark-version 3.5.8 --checkout
На выходе создаётся локальный образ ghcr.io/ytsaurus/spyt:2.9.2-pyspark-3.5.8.
Флаг --checkout необязателен. Если его передать, скрипт сам переключит репозиторий на релизный тег spyt/<spyt-version> (git fetch --tags + git checkout); при этом в отслеживаемых файлах не должно быть незакоммиченных изменений, иначе скрипт остановится с ошибкой. Если флаг не передавать, сборка пойдёт из текущего состояния рабочей копии — так удобно, когда вы уже находитесь на нужном теге или собираете образ из своей ветки. Флаги --spyt-version и --spark-version обязательны в любом случае: они задают версию артефактов SPYT, версию вкладываемого дистрибутива Spark и тег образа.
Шаги сборки
Скрипт последовательно выполняет:
git checkout tags/spyt/<spyt-version>— переключение на релизный тег (только с флагом--checkout)../gradlew assemble -PcustomSpytVersion=<spyt-version>— сборка артефактов SPYT (нужен JDK 17).- Загрузка вспомогательного дистрибутива Livy, если он требуется Dockerfile-ом данной версии.
tools/release/spyt_image/build.sh --spyt-version <spyt-version> --spark-version <spark-version>— сборка образа с вложенным дистрибутивом Spark.- Проверка, что образ действительно собрался.
Эти шаги при необходимости можно выполнить и вручную, без скрипта.
Публикация в собственный реестр
Собранный образ доступен только локально. В изолированной среде хост развёртывания обычно не имеет доступа к ghcr.io, но имеет доступ к внутреннему (корпоративному) Docker-реестру. Опубликуйте offline-образ в такой реестр, чтобы разворачивать SPYT из него, а не из публичного ghcr.io.
Проставьте образу тег вашего реестра и запушьте:
docker tag ghcr.io/ytsaurus/spyt:<spyt-version>-pyspark-<spark-version> \
<your-registry>/ytsaurus/spyt:<spyt-version>-pyspark-<spark-version>
docker push <your-registry>/ytsaurus/spyt:<spyt-version>-pyspark-<spark-version>
Например, для SPYT 2.9.2, Spark 3.5.8 и реестра registry.example.com:
docker tag ghcr.io/ytsaurus/spyt:2.9.2-pyspark-3.5.8 \
registry.example.com/ytsaurus/spyt:2.9.2-pyspark-3.5.8
docker push registry.example.com/ytsaurus/spyt:2.9.2-pyspark-3.5.8
Либо соберите образ сразу под нужный реестр — передайте его префикс в --image-cr, а --push опубликует результат:
tools/release/build_offline_image.sh \
--spyt-version <spyt-version> --spark-version <spark-version> \
--image-cr <your-registry>/ --push --checkout
Например:
tools/release/build_offline_image.sh \
--spyt-version 2.9.2 --spark-version 3.5.8 \
--image-cr registry.example.com/ --push --checkout
Полученный образ <your-registry>/ytsaurus/spyt:<spyt-version>-pyspark-<spark-version> указывайте при развёртывании.
Как использовать
Готовый образ разворачивает SPYT и дистрибутив Spark на кластер YTsaurus. Запустите контейнер из того образа, который собрали и опубликовали, указав адрес прокси и параметры доступа:
docker run --network=host \
-e YT_PROXY=<cluster-proxy> \
-e YT_USER=<user> \
-e YT_TOKEN=<token> \
-e SPARK_DISTRIB_OFFLINE=true \
-e SPARK_DISTRIB_VERSIONS=<spark-version> \
--rm <your-registry>/ytsaurus/spyt:<spyt-version>-pyspark-<spark-version>
Последний аргумент — образ, который запускается; в изолированном контуре это образ из вашего реестра (см. Публикация в собственный реестр). Флаг --rm необязателен — он удаляет контейнер после завершения: развёртывание разовое, контейнер отрабатывает и выходит.
Если публикации в реестр не было, а сборка и развёртывание выполняются на одной машине — укажите локально собранный образ (его тег по умолчанию — ghcr.io/ytsaurus/spyt:<spyt-version>-pyspark-<spark-version>). docker run возьмёт готовый образ из локального кэша Docker на этой машине и ничего не будет скачивать.
Например, для SPYT 2.9.2, Spark 3.5.8 и реестра registry.example.com:
docker run --network=host \
-e YT_PROXY=cluster.example.com \
-e YT_USER=spyt-deployer \
-e YT_TOKEN=<token> \
-e SPARK_DISTRIB_OFFLINE=true \
-e SPARK_DISTRIB_VERSIONS=3.5.8 \
--rm registry.example.com/ytsaurus/spyt:2.9.2-pyspark-3.5.8
Публикацией дистрибутива Spark на кластер управляют переменные окружения:
| Переменная | Назначение |
|---|---|
SPARK_DISTRIB_OFFLINE=true |
Полностью offline-режим: использовать только вложенный в образ дистрибутив Spark, ничего не скачивать. |
SPARK_DISTRIB_VERSIONS |
Список версий Spark (через пробел), которые нужно опубликовать на кластер. |
Как проверить, что развёртывание прошло успешно
Контейнер отрабатывает и завершается с нулевым кодом возврата. В логе контейнера сообщение Publication finished successfully означает, что опубликованы файлы SPYT; после него контейнер загружает на кластер дистрибутив Spark. Ненулевой код возврата означает, что развёртывание не состоялось.
Дополнительно проверьте, что на кластере появились артефакты (пути указаны для SPYT 2.9.2 и Spark 3.5.8):
yt list //home/spark/spyt/releases/2.9.2 # spyt-package.zip, setup-spyt-env.sh
yt list //home/spark/conf/releases/2.9.2 # spark-launch-conf и sidecar-конфиги
yt list //home/spark/distrib/3/5/8 # spark-3.5.8-bin-hadoop3.tgz, spark-connect_2.12-3.5.8.jar
После этого можно запускать Spark-приложения обычным образом.