O ACK Serverless executa tarefas Spark como Pods sob demanda — o faturamento é encerrado ao término do ciclo de vida do Pod, eliminando a necessidade de reservar recursos de computação ou expandir o cluster. Para reduzir ainda mais os custos, utilize instâncias preemptíveis.
Pré-requisitos
Antes de começar, certifique-se de ter:
Um cluster ACK Serverless. Consulte Criar um cluster ACK Serverless.
Um cliente kubectl conectado ao cluster. Consulte Conectar-se a um cluster ACK usando kubectl.
Implantar o spark-operator
Implante o chart Helm ack-spark-operator usando um dos métodos a seguir.
Opção 1: Console do ACK
Acesse o Container Service Management ConsoleContainer Service for Kubernetes (ACK) console.
No painel de navegação à esquerda, escolha Marketplace > Marketplace.
Pesquise e selecione ack-spark-operator e implante o chart.
Opção 2: Helm CLI (requer Helm V3 ou superior)
Execute os seguintes comandos:
# Create a service account
kubectl create serviceaccount spark
# Grant permissions
kubectl create clusterrolebinding spark-role --clusterrole=edit --serviceaccount=default:spark --namespace=default
# Add the Helm repository and install the operator
helm repo add aliyunhub https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator/
helm install ack-spark-operator aliyunhub/ack-spark-operator
Após a implantação, verifique se o spark-operator está em execução:
kubectl -n spark-operator get pod
Saída esperada:
NAME READY STATUS RESTARTS AGE
ack-spark-operator-7698586d7b-pvwln 1/1 Running 0 5m9s
ack-spark-operator-init-26tvh 0/1 Completed 0 5m9s
Executar uma tarefa Spark
Esta seção descreve como implantar o exemplo SparkPi integrado, que estima o valor de pi por amostragem Monte Carlo.
Etapa 1: Criar o manifesto do SparkApplication
Crie um arquivo chamado spark-pi.yaml com o seguinte conteúdo:
apiVersion: "sparkoperator.k8s.io/v1beta2"
kind: SparkApplication
metadata:
name: spark-pi
namespace: default
spec:
arguments:
- "1000"
sparkConf:
"spark.scheduler.maxRegisteredResourcesWaitingTime": "3000s"
"spark.kubernetes.allocation.batch.size": "1"
"spark.rpc.askTimeout": "36000s"
"spark.network.timeout": "36000s"
"spark.rpc.lookupTimeout": "36000s"
"spark.core.connection.ack.wait.timeout": "36000s"
"spark.executor.heartbeatInterval": "10000s"
type: Scala
mode: cluster
image: "registry.aliyuncs.com/acs/spark:ack-2.4.5-latest"
imagePullPolicy: Always
mainClass: org.apache.spark.examples.SparkPi
mainApplicationFile: "local:///opt/spark/examples/jars/spark-examples_2.11-2.4.5.jar"
sparkVersion: "2.4.5"
restartPolicy:
type: Never
driver:
cores: 4
coreLimit: "4"
annotations:
k8s.aliyun.com/eci-image-cache: "true"
memory: "6g"
memoryOverhead: "2g"
labels:
version: 2.4.5
serviceAccount: spark
executor:
annotations:
k8s.aliyun.com/eci-image-cache: "true"
cores: 2
instances: 1
memory: "3g"
memoryOverhead: "1g"
labels:
version: 2.4.5
Etapa 2: Enviar a tarefa
kubectl apply -f spark-pi.yaml
Saída esperada:
sparkapplication.sparkoperator.k8s.io/spark-pi created
Etapa 3: Verificar o status da tarefa
Execute o comando a seguir para verificar o status de implantação da tarefa Spark:
kubectl get pod
Saída esperada quando a tarefa está em andamento:
NAME READY STATUS RESTARTS AGE
spark-pi-driver 1/1 Running 0 2m12s
O pod está no estado Running, indicando que a tarefa Spark está sendo implantada.
Execute o comando novamente para conferir o status final:
kubectl get pod
Saída esperada quando a tarefa é concluída:
NAME READY STATUS RESTARTS AGE
spark-pi-driver 0/1 Completed 0 2m54s
O pod está no estado Completed, indicando que a tarefa Spark foi concluída.
Etapa 4: Visualizar o resultado
kubectl logs spark-pi-driver | grep Pi
Saída esperada:
20/04/30 07:27:51 INFO DAGScheduler: ResultStage 0 (reduce at SparkPi.scala:38) finished in 11.031 s
20/04/30 07:27:51 INFO DAGScheduler: Job 0 finished: reduce at SparkPi.scala:38, took 11.137920 s
Pi is roughly 3.1414371514143715
(Opcional) Usar instâncias preemptíveis
Adicione anotações de instâncias preemptíveis ao pod para reduzir os custos de computação. Para mais detalhes, consulte Usar instâncias preemptíveis.