Оркестрация ML-пайплайнов#
Данная ИИ-функция автоматизирует подготовку, обработку и анализ данных для задач машинного обучения: она управляет жизненным циклом приложений Apache Spark, что позволяет строить и выполнять вычислительные пайплайны обработки больших объемов данных для обучения моделей ИИ:
Сценарий позволяет пользователю:
декларативно задавать и запускать приложения Spark с помощью пользовательских ресурсов Kubernetes;
отслеживать состояние и ход выполнения приложений Spark в кластере;
просматривать журналы и результаты вычислений приложений Spark;
запускать приложения Spark по расписанию с помощью
ScheduledSparkApplication;автоматически повторно отправлять и перезапускать приложения при сбоях и обновлении определения.
Примечание
При использовании ИИ-функций DropApp соблюдайте правила работы пользователя с ИИ-функциями.
Предусловия#
Предварительными условиями выполнения сценария являются:
Развернутый кластер DropApp с установленным программным компонентом K8S Artificial Intelligence (K8SI).
Доступ к кластеру с правами, достаточными для просмотра состояния узлов, pod и пользовательских ресурсов, а также для создания приложений Spark.
Установленный и настроенный Spark Operator, который управляет пользовательскими ресурсами
SparkApplicationиScheduledSparkApplication.Наличие в кластере сервисного аккаунта для запуска pod Spark (например,
spark-operator-spark).Доступ к Docker-образу Spark (например,
docker.io/library/spark:4.0.1) и к файлу приложения (например,local:///opt/spark/examples/jars/spark-examples.jar).
Сведения о Spark Operator и его установке — в разделе «Spark Operator» Руководства администратора.
Проверка готовности Spark Operator#
Проверьте, что Spark Operator развернут в кластере и готов к управлению приложениями Spark. Работоспособность оператора подтверждается наличием развернутого pod оператора в пространстве имен spark-operator, а также доступностью пользовательских ресурсов SparkApplication и ScheduledSparkApplication.
Сценарий проверки готовности Spark Operator:
Убедитесь, что pod Spark Operator запущен и находится в состоянии
Running:kubectl get pods -n spark-operatorПример вывода:
NAME READY STATUS RESTARTS AGE spark-operator-controller-xxxxx 1/1 Running 0 5mУбедитесь, что пользовательские ресурсы
SparkApplicationиScheduledSparkApplicationзарегистрированы в кластере:kubectl get crd sparkapplications.sparkoperator.k8s.iokubectl get crd scheduledsparkapplications.sparkoperator.k8s.ioЕсли в выводе команд присутствуют пользовательские ресурсы
sparkapplications.sparkoperator.k8s.ioиscheduledsparkapplications.sparkoperator.k8s.io, Spark Operator готов к запуску приложений Spark.
Запуск приложения Spark#
Запустите приложение Spark в кластере, описав его декларативно с помощью пользовательского ресурса SparkApplication. Spark Operator автоматически выполняет spark-submit от имени пользователя для каждого созданного ресурса и управляет жизненным циклом его pod driver и executor.
Сценарий запуска приложения Spark:
Создайте манифест приложения
SparkApplication. Пример манифеста для вычисления числа Пи:apiVersion: sparkoperator.k8s.io/v1beta2 kind: SparkApplication metadata: name: spark-pi namespace: default spec: type: Scala mode: cluster image: docker.io/library/spark:4.0.1 imagePullPolicy: IfNotPresent mainClass: org.apache.spark.examples.SparkPi mainApplicationFile: local:///opt/spark/examples/jars/spark-examples.jar arguments: - "5000" sparkVersion: 4.0.1 driver: cores: 1 memory: 512m serviceAccount: spark-operator-spark securityContext: runAsUser: 185 runAsGroup: 185 runAsNonRoot: true allowPrivilegeEscalation: false executor: instances: 1 cores: 1 memory: 512m securityContext: runAsUser: 185 runAsGroup: 185 runAsNonRoot: true allowPrivilegeEscalation: falseГде:
type— язык приложения (Scala, Python, Java);mode— режим запуска (cluster или client);image— Docker-образ Spark;mainClass— главный класс приложения (для приложений на Scala и Java);mainApplicationFile— путь к файлу с приложением;arguments— аргументы, передаваемые приложению;sparkVersion— версия Spark;driverиexecutor— параметры poddriverиexecutor(количество ядер, объем памяти, сервисный аккаунт и параметры безопасности).
Примените манифест:
kubectl apply -f - <<EOF apiVersion: sparkoperator.k8s.io/v1beta2 kind: SparkApplication metadata: name: spark-pi namespace: default spec: type: Scala mode: cluster image: docker.io/library/spark:4.0.1 imagePullPolicy: IfNotPresent mainClass: org.apache.spark.examples.SparkPi mainApplicationFile: local:///opt/spark/examples/jars/spark-examples.jar arguments: - "5000" sparkVersion: 4.0.1 driver: cores: 1 memory: 512m serviceAccount: spark-operator-spark securityContext: runAsUser: 185 runAsGroup: 185 runAsNonRoot: true allowPrivilegeEscalation: false executor: instances: 1 cores: 1 memory: 512m securityContext: runAsUser: 185 runAsGroup: 185 runAsNonRoot: true allowPrivilegeEscalation: false EOFУбедитесь, что приложение Spark запущено и находится в состоянии
RUNNING:kubectl get sparkapplication spark-piПример вывода:
NAME STATUS ATTEMPTS START FINISH spark-pi RUNNING 1 2026-08-04T10:00:00ZПроверьте, что pod
driverиexecutorприложения созданы:kubectl get pods -l spark-role=driverkubectl get pods -l spark-role=executorПроверьте логи pod
driver, содержащие результат вычислений:kubectl logs spark-pi-driverПример вывода:
Pi is roughly 3.141592653589793После завершения вычислений убедитесь, что приложение перешло в состояние
COMPLETED:kubectl get sparkapplication spark-piПосле завершения проверки удалите приложение Spark:
kubectl delete sparkapplication spark-pi
Запуск приложения Spark по расписанию#
Запустите приложение Spark по расписанию с помощью пользовательского ресурса ScheduledSparkApplication. Spark Operator поддерживает нативное планирование (cron) и создает экземпляры приложений SparkApplication в соответствии с заданным расписанием.
Сценарий запуска приложения Spark по расписанию:
Создайте манифест
ScheduledSparkApplication, указав расписание в полеscheduleи шаблон приложения — вtemplate:apiVersion: sparkoperator.k8s.io/v1beta2 kind: ScheduledSparkApplication metadata: name: spark-pi-scheduled namespace: default spec: schedule: "@every 3m" concurrencyPolicy: Allow template: type: Scala mode: cluster image: docker.io/library/spark:4.0.1 imagePullPolicy: IfNotPresent mainClass: org.apache.spark.examples.SparkPi mainApplicationFile: local:///opt/spark/examples/jars/spark-examples.jar sparkVersion: 4.0.1 restartPolicy: type: Never driver: cores: 1 memory: 512m serviceAccount: spark-operator-spark securityContext: runAsUser: 185 runAsGroup: 185 runAsNonRoot: true allowPrivilegeEscalation: false executor: instances: 1 cores: 1 memory: 512m securityContext: runAsUser: 185 runAsGroup: 185 runAsNonRoot: true allowPrivilegeEscalation: falseГде:
schedule— расписание запуска приложений в формате cron (например,@every 3m,@hourly,0 0 * * *);concurrencyPolicy— политика обработки перекрывающихся запусков (Allow, Forbid, Replace);template— шаблон приложенияSparkApplication.
Примените манифест:
kubectl apply -f - <<EOF apiVersion: sparkoperator.k8s.io/v1beta2 kind: ScheduledSparkApplication metadata: name: spark-pi-scheduled namespace: default spec: schedule: "@every 3m" concurrencyPolicy: Allow template: type: Scala mode: cluster image: docker.io/library/spark:4.0.1 imagePullPolicy: IfNotPresent mainClass: org.apache.spark.examples.SparkPi mainApplicationFile: local:///opt/spark/examples/jars/spark-examples.jar sparkVersion: 4.0.1 restartPolicy: type: Never driver: cores: 1 memory: 512m serviceAccount: spark-operator-spark securityContext: runAsUser: 185 runAsGroup: 185 runAsNonRoot: true allowPrivilegeEscalation: false executor: instances: 1 cores: 1 memory: 512m securityContext: runAsUser: 185 runAsGroup: 185 runAsNonRoot: true allowPrivilegeEscalation: false EOFУбедитесь, что планировщик создает экземпляры приложений
SparkApplicationв соответствии с расписанием:kubectl get sparkapplicationkubectl get scheduledsparkapplication spark-pi-scheduledЕсли по истечении заданного интервала появляются новые экземпляры
SparkApplication, запуск приложения по расписанию настроен корректно.После завершения проверки удалите планировщик:
kubectl delete scheduledsparkapplication spark-pi-scheduled
Получение метрик приложения Spark#
Отслеживайте состояние и производительность приложений Spark с помощью метрик, собираемых Spark Operator. Spark Operator собирает метрики на уровне приложения, а также метрики pod driver и executor, и предоставляет их в формате, совместимом с Prometheus.
Сценарий получения метрик приложения Spark:
Убедитесь, что для приложений Spark включен сбор метрик (в конфигурации Spark Operator включена поддержка Prometheus).
Найдите pod
driverзапущенного приложения:kubectl get pods -l spark-role=driverПереадресуйте метрики pod
driver, собираемые на порту8090, на локальный порт8080:kubectl port-forward <spark_pi_driver_pod> 8080:8090 &Запросите метрики:
curl -sL http://<localhost-IP>:8080/metricsПример вывода:
# HELP spark_executor_cores Executor cores # TYPE spark_executor_cores gauge spark_executor_cores 1 # HELP spark_executor_memory Executor memory # TYPE spark_executor_memory gauge spark_executor_memory 536870912Метрики приложения Spark отражают выполнение вычислительного пайплайна и доступны для интеграции с системой мониторинга Prometheus.
Результат#
Ожидаемым результатом являются:
готовность Spark Operator к управлению приложениями Spark в кластере;
успешный запуск приложения Spark, его выполнение и получение его результата;
успешная настройка запуска приложений по расписанию;
доступность метрик выполнения для мониторинга.