Оркестрация 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:

  1. Убедитесь, что pod Spark Operator запущен и находится в состоянии Running:

    kubectl get pods -n spark-operator
    

    Пример вывода:

    NAME                                READY   STATUS    RESTARTS   AGE
    spark-operator-controller-xxxxx     1/1     Running   0          5m
    
  2. Убедитесь, что пользовательские ресурсы SparkApplication и ScheduledSparkApplication зарегистрированы в кластере:

    kubectl get crd sparkapplications.sparkoperator.k8s.io
    
    kubectl 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:

  1. Создайте манифест приложения 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 — параметры pod driver и executor (количество ядер, объем памяти, сервисный аккаунт и параметры безопасности).

  2. Примените манифест:

    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
    
  3. Убедитесь, что приложение Spark запущено и находится в состоянии RUNNING:

    kubectl get sparkapplication spark-pi
    

    Пример вывода:

    NAME       STATUS      ATTEMPTS   START                    FINISH
    spark-pi   RUNNING     1          2026-08-04T10:00:00Z
    
  4. Проверьте, что pod driver и executor приложения созданы:

    kubectl get pods -l spark-role=driver
    
    kubectl get pods -l spark-role=executor
    
  5. Проверьте логи pod driver, содержащие результат вычислений:

    kubectl logs spark-pi-driver
    

    Пример вывода:

    Pi is roughly 3.141592653589793
    
  6. После завершения вычислений убедитесь, что приложение перешло в состояние COMPLETED:

    kubectl get sparkapplication spark-pi
    
  7. После завершения проверки удалите приложение Spark:

    kubectl delete sparkapplication spark-pi
    

Запуск приложения Spark по расписанию#

Запустите приложение Spark по расписанию с помощью пользовательского ресурса ScheduledSparkApplication. Spark Operator поддерживает нативное планирование (cron) и создает экземпляры приложений SparkApplication в соответствии с заданным расписанием.

Сценарий запуска приложения Spark по расписанию:

  1. Создайте манифест 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.

  2. Примените манифест:

    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
    
  3. Убедитесь, что планировщик создает экземпляры приложений SparkApplication в соответствии с расписанием:

    kubectl get sparkapplication
    
    kubectl get scheduledsparkapplication spark-pi-scheduled
    

    Если по истечении заданного интервала появляются новые экземпляры SparkApplication, запуск приложения по расписанию настроен корректно.

  4. После завершения проверки удалите планировщик:

    kubectl delete scheduledsparkapplication spark-pi-scheduled
    

Получение метрик приложения Spark#

Отслеживайте состояние и производительность приложений Spark с помощью метрик, собираемых Spark Operator. Spark Operator собирает метрики на уровне приложения, а также метрики pod driver и executor, и предоставляет их в формате, совместимом с Prometheus.

Сценарий получения метрик приложения Spark:

  1. Убедитесь, что для приложений Spark включен сбор метрик (в конфигурации Spark Operator включена поддержка Prometheus).

  2. Найдите pod driver запущенного приложения:

    kubectl get pods -l spark-role=driver
    
  3. Переадресуйте метрики pod driver, собираемые на порту 8090, на локальный порт 8080:

    kubectl port-forward <spark_pi_driver_pod> 8080:8090 &
    
  4. Запросите метрики:

    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, его выполнение и получение его результата;

  • успешная настройка запуска приложений по расписанию;

  • доступность метрик выполнения для мониторинга.