ACK Serverless ejecuta las tareas de Spark como Pods bajo demanda. La facturación se detiene cuando finaliza el ciclo de vida del Pod, por lo que no es necesario reservar recursos de cómputo ni ampliar el clúster. Para reducir aún más los costos, utilice preemptible instances.
Requisitos previos
Antes de empezar, asegúrese de contar con a continuación:
Un clúster de ACK Serverless. Consulte Create an ACK Serverless cluster.
Un cliente kubectl conectado al clúster. Consulte Connect to an ACK cluster by using kubectl.
Despliegue spark-operator
Despliegue el chart de Helm ack-spark-operator mediante uno de los siguientes métodos.
Opción 1: Consola de ACK
Inicie sesión en la Container Service Management Consoleconsola de Container Service for Kubernetes (ACK).
En el panel de navegación izquierdo, seleccione Marketplace > Marketplace.
Busque y seleccione ack-spark-operator, y luego despliegue el chart.
Opción 2: CLI de Helm (se requiere Helm V3 o posterior)
Ejecute los siguientes 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
Después del despliegue, compruebe que spark-operator se esté ejecutando:
kubectl -n spark-operator get pod
Salida 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
Ejecutar una tarea de Spark
En esta sección se describe cómo desplegar el ejemplo integrado SparkPi, que estima el valor de pi mediante muestreo de Montecarlo.
Paso 1: Crear el manifiesto de SparkApplication
Cree un archivo llamado spark-pi.yaml con el siguiente contenido:
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
Paso 2: Enviar la tarea
kubectl apply -f spark-pi.yaml
Salida esperada:
sparkapplication.sparkoperator.k8s.io/spark-pi created
Paso 3: Comprobar el estado de la tarea
Ejecute el siguiente comando para consultar el estado de despliegue de la tarea de Spark:
kubectl get pod
Salida esperada mientras la tarea está en curso:
NAME READY STATUS RESTARTS AGE
spark-pi-driver 1/1 Running 0 2m12s
El pod se encuentra en estado Running, lo que indica que la tarea de Spark se está desplegando.
Vuelva a ejecutar el comando para comprobar el estado final:
kubectl get pod
Salida esperada cuando la tarea finaliza:
NAME READY STATUS RESTARTS AGE
spark-pi-driver 0/1 Completed 0 2m54s
El pod se encuentra en estado Completed, lo que indica que la tarea de Spark se ha desplegado correctamente.
Paso 4: Consultar el resultado
kubectl logs spark-pi-driver | grep Pi
Salida 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) Uso de preemptible instances
Agregue anotaciones de preemptible instances al pod para reducir los costos de cómputo. Para obtener más información, consulte Use preemptible instances.