Todos os produtos
Search
Central de documentação

Container Service for Kubernetes:Run Spark jobs with Spark Operator

Última atualização: Jun 27, 2026

Instale o Spark Operator no ACK para gerenciar todo o ciclo de vida dos jobs do Spark usando manifests declarativos do Kubernetes.

Pré-requisitos

Como funciona

O Spark Operator automatiza o ciclo de vida de jobs do Spark no Kubernetes usando recursos CustomResourceDefinition (CRD), como SparkApplication e ScheduledSparkApplication. Ele utiliza funcionalidades nativas do Kubernetes, como dimensionamento automático, verificações de integridade e gerenciamento de recursos. O ACK fornece o ack-spark-operator, baseado no projeto kubeflow/spark-operator. Consulte Spark Operator | Kubeflow.

Benefícios:

  • Gerenciamento simplificado: Automatize a implantação e o ciclo de vida de jobs do Spark com configurações declarativas do Kubernetes.

  • Suporte a multilocação: Use namespaces e cotas de recursos do Kubernetes para isolar recursos. Selecione nós específicos para executar cargas de trabalho do Spark em recursos dedicados.

  • Provisionamento elástico de recursos: Escale com recursos elásticos, como Elastic Container Instance (ECI) ou pools de nós elásticos durante picos de carga, equilibrando desempenho e custo.

Casos de uso:

  • Análise de dados: Use o Spark para análises interativas e limpeza de dados.

  • Computação em lote: Execute jobs em lote agendados para processar grandes conjuntos de dados.

  • Processamento em tempo real: Processe fluxos de dados em tempo real com o Spark Streaming.

Visão geral do procedimento

O fluxo de trabalho abrange a implantação do Spark Operator, o envio de jobs, o monitoramento da execução e o gerenciamento do ciclo de vida do job.

  1. Implantar o componente ack-spark-operator: Instale o Spark Operator no cluster ACK.

  2. Enviar um job do Spark: Crie e envie um manifesto de job do Spark.

  3. Monitorar o job do Spark: Verifique o status do job, o status dos pods e os logs.

  4. Acessar a interface web do Spark: Visualize os detalhes da execução do job no navegador.

  5. Atualizar o job do Spark: Modifique e reaplique o manifesto do job.

  6. Excluir o job do Spark: Remova o job e libere os recursos.

Etapa 1: Implantar o componente ack-spark-operator

  1. Faça login no ACK console. No painel de navegação à esquerda, clique em Marketplace > Marketplace.

  2. Na página Marketplace, clique na aba App Catalog, pesquise e selecione ack-spark-operator.

  3. Na página do ack-spark-operator, clique em Deploy.

  4. No painel Create, selecione um cluster e namespace e clique em Next.

  5. Na página Parameters, configure os parâmetros e clique em OK.

    Os principais parâmetros estão listados abaixo. Para obter a lista completa, consulte a aba ConfigMaps na página do ack-spark-operator.

    Parâmetro

    Descrição

    Padrão

    controller.replicas

    Número de réplicas do controlador.

    1

    webhook.replicas

    Número de réplicas do webhook.

    1

    spark.jobNamespaces

    Namespaces onde os jobs do Spark podem ser executados. Uma string vazia permite todos os namespaces. Separe vários valores com vírgulas (,).

    • ["default"] (padrão)

    • [""] (todos os namespaces)

    • ["ns1","ns2","ns3"] (vários namespaces)

    spark.serviceAccount.name

    O Spark Operator cria uma ServiceAccount chamada spark-operator-spark e os recursos RBAC necessários em cada namespace especificado por spark.jobNamespaces. Se personalizado, especifique o novo nome ao enviar jobs do Spark.

    spark-operator-spark

Etapa 2: Enviar um job do Spark

Crie um manifesto SparkApplication para enviar um job do Spark.

  1. Crie o seguinte manifesto e salve-o como spark-pi.yaml.

    apiVersion: sparkoperator.k8s.io/v1beta2
    kind: SparkApplication
    metadata:
      name: spark-pi
      namespace: default     # The namespace must be in the list of namespaces specified by spark.jobNamespaces.
    spec:
      type: Scala
      mode: cluster
      image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/spark:3.5.4
      imagePullPolicy: IfNotPresent
      mainClass: org.apache.spark.examples.SparkPi
      mainApplicationFile: local:///opt/spark/examples/jars/spark-examples_2.12-3.5.4.jar
      arguments:
      - "1000"
      sparkVersion: 3.5.4
      driver:
        cores: 1
        coreLimit: 1200m
        memory: 512m
        serviceAccount: spark-operator-spark   # If you customized the ServiceAccount name, change the value accordingly.
      executor:
        instances: 1
        cores: 1
        coreLimit: 1200m
        memory: 512m
      restartPolicy:
        type: Never
  2. Envie o job do Spark:

    kubectl apply -f spark-pi.yaml

    Saída esperada:

    sparkapplication.sparkoperator.k8s.io/spark-pi created

Etapa 3: Monitorar o job do Spark

Verifique o status, os pods e os logs do job do Spark.

  1. Verifique o status do job do Spark:

    kubectl get sparkapplication spark-pi

    Saída esperada:

    NAME       STATUS      ATTEMPTS   START                  FINISH       AGE
    spark-pi   SUBMITTED   1          2024-06-04T03:17:11Z   <no value>   15s
  2. Verifique o status dos pods. Este comando filtra os pods pelo rótulo sparkoperator.k8s.io/app-name=spark-pi:

    kubectl get pod -l sparkoperator.k8s.io/app-name=spark-pi

    Saída esperada:

    NAME                               READY   STATUS    RESTARTS   AGE
    spark-pi-driver                    1/1     Running   0          49s
    spark-pi-7272428fc8f5f392-exec-1   1/1     Running   0          13s

    Após a conclusão do job, o driver exclui todos os pods executores.

  3. Visualize os detalhes do job do Spark:

    kubectl describe sparkapplication spark-pi

    Exemplo de saída

    A saída varia conforme o status do job.

    Name:         spark-pi
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    API Version:  sparkoperator.k8s.io/v1beta2
    Kind:         SparkApplication
    Metadata:
      Creation Timestamp:  2024-06-04T03:16:59Z
      Generation:          1
      Resource Version:    1350200
      UID:                 1a1f9160-5dbb-XXXX-XXXX-be1c1fda4859
    Spec:
      Arguments:
        1000
      Driver:
        Core Limit:  1200m
        Cores:       1
        Memory:           512m
        Service Account:  spark
      Executor:
        Core Limit:  1200m
        Cores:       1
        Instances:   1
        Memory:               512m
      Image:                  registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/spark:3.5.4
      Image Pull Policy:      IfNotPresent
      Main Application File:  local:///opt/spark/examples/jars/spark-examples_2.12-3.5.4.jar
      Main Class:             org.apache.spark.examples.SparkPi
      Mode:                   cluster
      Restart Policy:
        Type:         Never
      Spark Version:  3.5.4
      Type:           Scala
    Status:
      Application State:
        State:  COMPLETED
      Driver Info:
        Pod Name:             spark-pi-driver
        Web UI Address:       172.XX.XX.92:0
        Web UI Port:          4040
        Web UI Service Name:  spark-pi-ui-svc
      Execution Attempts:     1
      Executor State:
        spark-pi-26c5XXXXX1408337-exec-1:  COMPLETED
      Last Submission Attempt Time:        2024-06-04T03:17:11Z
      Spark Application Id:                spark-0042dead12XXXXXX43675f09552a946
      Submission Attempts:                 1
      Submission ID:                       117ee161-3951-XXXX-XXXX-e7d24626c877
      Termination Time:                    2024-06-04T03:17:55Z
    Events:
      Type    Reason                     Age   From            Message
      ----    ------                     ----  ----            -------
      Normal  SparkApplicationAdded      91s   spark-operator  SparkApplication spark-pi was added, enqueuing it for submission
      Normal  SparkApplicationSubmitted  79s   spark-operator  SparkApplication spark-pi was submitted successfully
      Normal  SparkDriverRunning         61s   spark-operator  Driver spark-pi-driver is running
      Normal  SparkExecutorPending       56s   spark-operator  Executor [spark-pi-26c5XXXXX1408337-exec-1] is pending
      Normal  SparkExecutorRunning       53s   spark-operator  Executor [spark-pi-26c5XXXXX1408337-exec-1] is running
      Normal  SparkDriverCompleted       35s   spark-operator  Driver spark-pi-driver completed
      Normal  SparkApplicationCompleted  35s   spark-operator  SparkApplication spark-pi completed
      Normal  SparkExecutorCompleted     35s   spark-operator  Executor [spark-pi-26c5XXXXX1408337-exec-1] completed
  4. Visualize as últimas 20 linhas dos logs do pod driver:

    kubectl logs --tail=20 spark-pi-driver

    Saída esperada:

    24/05/30 10:05:30 INFO TaskSchedulerImpl: Removed TaskSet 0.0, whose tasks have all completed, from pool
    24/05/30 10:05:30 INFO DAGScheduler: ResultStage 0 (reduce at SparkPi.scala:38) finished in 7.942 s
    24/05/30 10:05:30 INFO DAGScheduler: Job 0 is finished. Cancelling potential speculative or zombie tasks for this job
    24/05/30 10:05:30 INFO TaskSchedulerImpl: Killing all running tasks in stage 0: Stage finished
    24/05/30 10:05:30 INFO DAGScheduler: Job 0 finished: reduce at SparkPi.scala:38, took 8.043996 s
    Pi is roughly 3.1419522314195225
    24/05/30 10:05:30 INFO SparkContext: SparkContext is stopping with exitCode 0.
    24/05/30 10:05:30 INFO SparkUI: Stopped Spark web UI at http://spark-pi-1e18858fc8f56b14-driver-svc.default.svc:4040
    24/05/30 10:05:30 INFO KubernetesClusterSchedulerBackend: Shutting down all executors
    24/05/30 10:05:30 INFO KubernetesClusterSchedulerBackend$KubernetesDriverEndpoint: Asking each executor to shut down
    24/05/30 10:05:30 WARN ExecutorPodsWatchSnapshotSource: Kubernetes client has been closed.
    24/05/30 10:05:30 INFO MapOutputTrackerMasterEndpoint: MapOutputTrackerMasterEndpoint stopped!
    24/05/30 10:05:30 INFO MemoryStore: MemoryStore cleared
    24/05/30 10:05:30 INFO BlockManager: BlockManager stopped
    24/05/30 10:05:30 INFO BlockManagerMaster: BlockManagerMaster stopped
    24/05/30 10:05:30 INFO OutputCommitCoordinator$OutputCommitCoordinatorEndpoint: OutputCommitCoordinator stopped!
    24/05/30 10:05:30 INFO SparkContext: Successfully stopped SparkContext
    24/05/30 10:05:30 INFO ShutdownHookManager: Shutdown hook called
    24/05/30 10:05:30 INFO ShutdownHookManager: Deleting directory /var/data/spark-14ed60f1-82cd-4a33-b1b3-9e5d975c5b1e/spark-01120c89-5296-4c83-8a20-0799eef4e0ee
    24/05/30 10:05:30 INFO ShutdownHookManager: Deleting directory /tmp/spark-5f98ed73-576a-41be-855d-dabdcf7de189

Etapa 4: Acessar a interface web do Spark

A interface web fica disponível apenas enquanto o pod driver está em execução (Running).

Por padrão, controller.uiService.enable é true, o que cria um Service para expor a interface web via redirecionamento de porta. Se definido como false, nenhum Service será criado e você deverá fazer o redirecionamento de porta diretamente do pod driver.

Importante

O comando kubectl port-forward é adequado para testes, mas não recomendado para produção devido a riscos de segurança.

  1. Encaminhe a porta da interface web para sua máquina local:

    • Redirecionamento via Service

      kubectl port-forward services/spark-pi-ui-svc 4040
    • Redirecionamento via pod

      kubectl port-forward pods/spark-pi-driver 4040

      Saída esperada:

      Forwarding from 127.0.0.1:4040 -> 4040
      Forwarding from [::1]:4040 -> 4040
  2. Abra http://127.0.0.1:4040 no navegador.

(Opcional) Etapa 5: Atualizar o job do Spark

Atualize o manifesto do job para modificar os parâmetros do job do Spark.

  1. Edite o arquivo spark-pi.yaml. Por exemplo, defina arguments como 10000 e as instâncias do executor como 2.

    apiVersion: sparkoperator.k8s.io/v1beta2
    kind: SparkApplication
    metadata:
      name: spark-pi
    spec:
      type: Scala
      mode: cluster
      image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/spark:3.5.4
      imagePullPolicy: IfNotPresent
      mainClass: org.apache.spark.examples.SparkPi
      mainApplicationFile: local:///opt/spark/examples/jars/spark-examples_2.12-3.5.4.jar
      arguments:
      - "10000"
      sparkVersion: 3.5.4
      driver:
        cores: 1
        coreLimit: 1200m
        memory: 512m
        serviceAccount: spark-operator-spark # If you customized the ServiceAccount name, change the value accordingly.
      executor:
        instances: 2
        cores: 1
        coreLimit: 1200m
        memory: 512m
      restartPolicy:
        type: Never
  2. Aplique as alterações:

    kubectl apply -f spark-pi.yaml
  3. Verifique o status do job:

    kubectl get sparkapplication spark-pi

    O job do Spark será executado novamente. Saída esperada:

    NAME       STATUS    ATTEMPTS   START                  FINISH       AGE
    spark-pi   RUNNING   1          2024-06-04T03:37:34Z   <no value>   20m

(Opcional) Etapa 6: Excluir o job do Spark

Exclua o job do Spark para liberar seus recursos associados.

kubectl delete -f spark-pi.yaml

Alternativamente:

kubectl delete sparkapplication spark-pi

Referências