Instale o Spark Operator no ACK e gerencie todo o ciclo de vida dos jobs do Spark com manifests declarativos do Kubernetes.
Pré-requisitos
Um cluster ACK Pro ou cluster ACK Serverless Pro executando o Kubernetes 1.24 ou posterior. Consulte Create an ACK managed cluster, Create an ACK Serverless cluster e Manually upgrade ACK clusters.
Um cliente kubectl conectado ao cluster ACK. Para mais informações, consulte Connect to an ACK cluster using kubectl.
Como funciona
O Spark Operator automatiza o ciclo de vida dos jobs do Spark no Kubernetes usando recursos de CustomResourceDefinition (CRD), como SparkApplication e ScheduledSparkApplication. Ele utiliza recursos nativos do Kubernetes, como Auto Scaling, verificações de integridade e gerenciamento de recursos. O ACK fornece o ack-spark-operator, baseado no kubeflow/spark-operator. Consulte Spark Operator | Kubeflow.
Benefícios:
Gerenciamento simplificado: automatize a implantação e o ciclo de vida dos jobs do Spark com configurações declarativas do Kubernetes.
Suporte a multilocação: utilize namespaces e cotas de recursos do Kubernetes para isolar recursos. Use a seleção de nós e execute cargas de trabalho do Spark em recursos dedicados.
Provisionamento elástico de recursos: dimensione com recursos elásticos, como Elastic Container Instance (ECI) ou pools de nós elásticos, durante picos de carga para equilibrar 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 conjuntos de dados em grande escala.
Processamento em tempo real: o Spark Streaming permite o processamento de fluxos de dados em tempo real.
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 dos jobs.
Implantar o componente ack-spark-operator: instale o Spark Operator no seu cluster ACK.
Enviar um job do Spark: crie e envie um manifest de job do Spark.
Monitorar o job do Spark: verifique o status do job, o status dos pods e os logs.
Acessar a interface web do Spark: visualize os detalhes de execução do job no navegador.
Atualizar o job do Spark: modifique e reaplique o manifest do job.
Excluir o job do Spark: remova o job e libere os recursos.
Etapa 1: Implantar o componente ack-spark-operator
Acesse o ACK console. No painel de navegação à esquerda, clique em .
Na página Marketplace, clique na guia App Catalog, pesquise e selecione ack-spark-operator.
Na página ack-spark-operator, clique em Deploy.
No painel Create, selecione um cluster e um namespace e clique em Next.
-
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 guia ConfigMaps na página ack-spark-operator.
Parâmetro
Descrição
Padrão
controller.replicasO número de réplicas do controller.
1
webhook.replicasO número de réplicas do webhook.
1
spark.jobNamespacesNamespaces 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"](múltiplos namespaces)
spark.serviceAccount.nameO Spark Operator cria uma ServiceAccount chamada
spark-operator-sparke os recursos RBAC necessários em cada namespace especificado porspark.jobNamespaces. Caso seja personalizado, especifique o novo nome ao enviar jobs do Spark.spark-operator-spark -
Etapa 2: Envie um job do Spark
Para começar, crie um manifest do SparkApplication e envie um job do Spark.
-
Agora, crie o seguinte manifest 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 -
Envie o job do Spark:
kubectl apply -f spark-pi.yamlSaí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.
-
Verifique o status do job do Spark:
kubectl get sparkapplication spark-piSaída esperada:
NAME STATUS ATTEMPTS START FINISH AGE spark-pi SUBMITTED 1 2024-06-04T03:17:11Z <no value> 15s -
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-piSaída esperada:
NAME READY STATUS RESTARTS AGE spark-pi-driver 1/1 Running 0 49s spark-pi-7272428fc8f5f392-exec-1 1/1 Running 0 13sApós a conclusão do job, o driver exclui todos os pods do executor.
-
Visualize os detalhes do job do Spark:
kubectl describe sparkapplication spark-pi -
Visualize as últimas 20 linhas dos logs do pod driver:
kubectl logs --tail=20 spark-pi-driverSaí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á com o status Running.
Para expor a interface web, ative o parâmetro controller.uiService.enable. Por padrão, ele é true, o que cria um Service para encaminhamento de porta. Se for definido como false, nenhum Service é criado e você deve fazer o encaminhamento de porta diretamente do pod driver.
O comando kubectl port-forward é adequado para testes, mas não é recomendado para produção devido a riscos de segurança.
-
Encaminhe a porta da interface web para sua máquina local:
-
Encaminhamento de porta via Service
kubectl port-forward services/spark-pi-ui-svc 4040 -
Encaminhamento de porta via pod
kubectl port-forward pods/spark-pi-driver 4040Saída esperada:
Forwarding from 127.0.0.1:4040 -> 4040 Forwarding from [::1]:4040 -> 4040
-
Abra http://127.0.0.1:4040 no seu navegador.
(Opcional) Etapa 5: Atualize o job do Spark
Para modificar os parâmetros do job do Spark, atualize o manifest do job.
-
Edite
spark-pi.yaml. Por exemplo, definaargumentscomo10000e as instâncias doexecutorcomo2.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 -
Aplique as alterações:
kubectl apply -f spark-pi.yaml -
Verifique o status do job:
kubectl get sparkapplication spark-piO 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: Exclua o job do Spark
Para liberar seus recursos associados, exclua o job do Spark.
kubectl delete -f spark-pi.yaml
Como alternativa:
kubectl delete sparkapplication spark-pi
Referências
Consulte View Spark job information with Spark History Server.
Consulte Collect Spark job logs with Log Service.
Consulte Read and write OSS data in Spark jobs.
Consulte Use Celeborn as RSS in Spark jobs.