Spark Operator#

Spark Operator - инструмент, который использует пользовательские ресурсы Kubernetes для задания, запуска и отображения состояния приложений Spark.

Основные функции:

  • Включает декларативное определение приложений и управление приложениями за счет расширений Kubernetes API.

  • Автоматически запускает spark-submit от имени пользователей для каждого SparkApplication, который подлежит отправке.

  • Предоставляет встроенную поддержку cron для запуска приложений.

  • Поддерживает настройку pod Spark через вебхук mutating admission, например, подключение ConfigMaps и томов и настройку affinity/anti-affinity pod.

  • Обеспечивает автоматическое повторное отправление обновленных объектов SparkApplication с обновленным определением.

  • Реализует автоматический перезапуск приложений с настраиваемой политикой перезапуска.

  • Выполняет автоматические повторные попытки отправки объекта SparkApplication при сбое с необязательным линейным откатом.

  • Собирает и экспортирует метрики на уровне приложения и метрики driver/executor в Prometheus.

Подготовка к установке#

Соберите образ Spark Operator путем добавления бинарного файла spark-operator к образу Apache spark:

  1. Создайте docker-файл:

    ARG SPARK_IMAGE=spark:3.5.1 # образ spark
    ARG SPARK_OPERATOR
    
    FROM ${SPARK_OPERATOR} AS spark_operator # образ dapp-spark-operator
    
    FROM ${SPARK_IMAGE}
    
    USER root
    
    RUN apt-get update \
    && apt-get install -y tini \
    && rm -rf /var/lib/apt/lists/*
    
    RUN mkdir -p /etc/k8s-webhook-server/serving-certs /home/spark && \
    chmod -R g+rw /etc/k8s-webhook-server/serving-certs && \
    chown -R spark /etc/k8s-webhook-server/serving-certs /home/spark
    
    USER spark
    
    COPY --from=spark_operator /spark-operator /usr/bin/spark-operator
    
    COPY entrypoint.sh /usr/bin/
    
    ENTRYPOINT ["/usr/bin/entrypoint.sh"]
    
  2. Выполните:

    docker build -t my-spark-operator: 2.0.2 --build-arg SPARK_IMAGE=your-spark-image SPARK_OPERATOR=dropapp-spark-operator-image .
    

Установка с помощью Helm#

Чтобы установить Spark Operator с помощью Helm:

  1. Добавьте репозиторий Spark Operator:

    helm repo add spark-operator <repoexample>/spark-operator/
    

    Где <repoexample> в зависимости от размещения:

    • ссылка на удаленный репозиторий;

    • путь к локальному репозиторию.

  2. Для развертывания выполните:

    helm install spark-operator spark-operator/spark-operator -n spark-operator
    

    Пример конфигурации:

    apiVersion: sparkoperator.k8s.io/v1beta1
    kind: SparkApplication
    metadata:
      name: spark-pod-example
    spec:
      type: Scala  # Язык приложения (Scala, Python, Java и др.)
      mode: cluster  # Режим запуска (cluster или client)
      sparkVersion: "3.3.2"  # Версия Spark
      image: "spark-operator/spark-py:3.3.2"  # Docker-образ для Spark
      mainClass: org.apache.spark.examples.SparkPi  # Главный класс приложения
      mainApplicationFile: "<repoexample>/spark-examples.jar"  # Путь к файлу с приложением
      arguments:
        - "100"  # Аргументы для приложения
      sparkProperties:
        spark.master: "k8s://https://kubernetes.default.svc"  # Master URL для Kubernetes
        spark.executor.memory: "2g"  # Память для executor
        spark.driver.memory: "2g"  # Память для driver
        spark.executor.cores: "1"  # Ядра для executor
      driver:
        cores: 1  # Ядра для driver
        memory: "2g"  # Память для driver
        labels:
          version: "3.3.2"  # Метки для driver
      executor:
        cores: 1  # Ядра для executor
        memory: "2g"  # Память для executor
        labels:
          version: "3.3.2"  # Метки для executor
      volumes:
        - name: spark-logs
          hostPath:
            path: /var/log/spark
            type: Directory
    
  3. Убедитесь, что pod spark-pi в пространстве имен spark-operator находятся в состоянии Running:

    kubectl get pods -n spark-operator