Google Distributed Cloud (GDC) aislado proporciona un contenedor de Dataproc para Spark. Se trata de un entorno de Apache Spark para el procesamiento de datos. Para obtener más información sobre Apache Spark, consulta https://spark.apache.org/
. Usa contenedores de Dataproc Container for Spark para ejecutar aplicaciones de Spark nuevas o existentes en un clúster de Kubernetes de Distributed Cloud con una alteración mínima. Si conoces las herramientas de Spark, puedes seguir usándolas.
Define tu aplicación de Spark en un archivo YAML y Distributed Cloud asignará los recursos por ti. El contenedor de Dataproc para Spark se inicia en segundos. Los ejecutores de Spark se escalan verticalmente o se apagan según tus necesidades.
Configura contenedores de Dataproc Container for Spark en Distributed Cloud para usar hardware especializado, como nodos de hardware especializados o GPU.
Implementa el servicio de contenedor de Dataproc para Spark
El administrador de la plataforma (AP) debe instalar los servicios de Marketplace para que puedas usarlos. Comunícate con tu PA si necesitas Dataproc Container para Spark. Consulta Cómo instalar un paquete de software de GDC Marketplace para obtener más información.
Requisitos previos para ejecutar aplicaciones de Spark
Debes tener una cuenta de servicio en los clústeres de usuarios para usar el servicio de Dataproc Container for Spark. El contenedor de Dataproc para Spark crea un pod de controlador de Spark para ejecutar una aplicación de Spark. Un pod de controlador de Spark necesita una cuenta de servicio de Kubernetes en el espacio de nombres del pod con permisos para realizar las siguientes acciones:
- Crear, obtener, enumerar y borrar pods de ejecutores
- Crea un servicio sin interfaz gráfica de Kubernetes para el controlador.
Antes de ejecutar una aplicación de Spark, completa los siguientes pasos para asegurarte de tener una cuenta de servicio con los permisos anteriores en el espacio de nombres foo
:
Crea una cuenta de servicio para que un pod del controlador de Spark la use en el espacio de nombres
foo
:kubectl create serviceaccount spark --kubeconfig AO_USER_KUBECONFIG --namespace=foo
Crea un rol para otorgar permisos para crear, obtener, enumerar y borrar Pods de ejecutores, y crea un servicio sin interfaz gráfica de Kubernetes para el controlador en el espacio de nombres
foo
:kubectl create role spark-driver --kubeconfig AO_USER_KUBECONFIG --verb=* \ --resource=pods,services,configmaps,persistentvolumeclaims \ --namespace=foo
Crea una vinculación de rol para otorgar acceso de rol a la cuenta de servicio en el espacio de nombres
foo
:kubectl create --kubeconfig AO_USER_KUBECONFIG \ rolebinding spark-spark-driver \ --role=spark-driver --serviceaccount=foo:spark \ --namespace=foo
Ejecuta aplicaciones de muestra de Spark 3
La contenerización de aplicaciones de Spark simplifica la ejecución de aplicaciones de macrodatos en tus instalaciones con Distributed Cloud. Como operador de aplicaciones (AO), ejecuta aplicaciones de Spark especificadas en objetos de GKE del tipo de recurso personalizado SparkApplication
.
Para ejecutar y usar una aplicación de Apache Spark 3 en Distributed Cloud, completa los siguientes pasos:
Examina la imagen
spark-operator
en tu proyecto para encontrar el$DATAPROC_IMAGE
al que se hace referencia en tu aplicación de Spark:export DATAPROC_IMAGE=$(kubectl get pod --kubeconfig AO_USER_KUBECONFIG \ --selector app.kubernetes.io/name=spark-operator -n foo \ -o=jsonpath='{.items[*].spec.containers[0].image}' \ | sed 's/spark-operator/dataproc/')
Por ejemplo:
export DATAPROC_IMAGE=10.200.8.2:10443/dataproc-service/private-cloud-devel/dataproc:3.1-dataproc-17
Escribe una especificación
SparkApplication
y almacénala en un archivo YAML. Para obtener más información, consulta la sección Escribe una especificación de la aplicación de Spark.Envía, ejecuta y supervisa tu aplicación de Spark según se configuró en una especificación de
SparkApplication
en el clúster de GKE con el comandokubectl
. Para obtener más información, consulta la sección Ejemplos de aplicación.Revisa el estado de la solicitud.
Opcional: Revisa los registros de la aplicación. Para obtener más información, consulta la sección Cómo ver los registros de una aplicación de Spark 3.
Usa la aplicación de Spark para recopilar y mostrar el estado del controlador y los ejecutores al usuario.
Escribe una especificación de aplicación de Spark
Una especificación de SparkApplication
incluye los siguientes componentes:
- El campo
apiVersion
- El campo
kind
- El campo
metadata
- La sección
spec
.
Para obtener más información, consulta Cómo escribir una especificación de SparkApplication en GitHub: https://github.com/kubeflow/spark-operator/blob/gh-pages/docs/user-guide.md#writing-a-sparkapplication-spec
Ejemplos de aplicación
En esta sección, se incluyen los siguientes ejemplos con sus especificaciones de SparkApplication
correspondientes para ejecutar aplicaciones de Spark:
Spark Pi
En esta sección, se incluye un ejemplo para ejecutar una aplicación de Spark Pi que requiere mucha capacidad de procesamiento y que estima 𝛑 (pi) lanzando dardos en un círculo.
Sigue estos pasos para ejecutar Spark Pi:
Aplica el siguiente ejemplo de especificación
SparkApplication
en el clúster de usuario:apiVersion: "sparkoperator.k8s.io/v1beta2" kind: SparkApplication metadata: name: spark-pi namespace: foo spec: type: Python pythonVersion: "3" mode: cluster image: "${DATAPROC_IMAGE?}" imagePullPolicy: IfNotPresent mainApplicationFile: "local:///usr/lib/spark/examples/src/main/python/pi.py" sparkVersion: "3.1.3" restartPolicy: type: Never driver: cores: 1 coreLimit: "1000m" memory: "512m" serviceAccount: spark executor: cores: 1 instances: 1 memory: "512m"
Verifica que el ejemplo de especificación de
SparkApplication
se ejecute y complete en 1 o 2 minutos con el siguiente comando:kubectl --kubeconfig AO_USER_KUBECONFIG get SparkApplication spark-pi -n foo
Consulta los Registros del controlador para ver el resultado:
kubectl --kubeconfig AO_USER_KUBECONFIG logs spark-pi-driver -n foo | grep "Pi is roughly"
El resultado es similar al siguiente:
Pi is roughly 3.1407357036785184
Para obtener más información, consulta los siguientes recursos:
- Para ver el código de la aplicación, consulta el artículo Estimación de Pi de la documentación de Apache Spark:
https://spark.apache.org/examples.html
. - Para ver un ejemplo de un archivo YAML de Spark Pi, consulta Escribe una especificación de aplicación de Spark.
Spark SQL
Sigue estos pasos para ejecutar Spark SQL:
Para ejecutar una aplicación de Spark SQL que selecciona el valor de
1
, usa la siguiente consulta:select 1;
Aplica el siguiente ejemplo de especificación
SparkApplication
en el clúster de usuario:apiVersion: "sparkoperator.k8s.io/v1beta2" kind: SparkApplication metadata: name: pyspark-sql-arrow namespace: foo spec: type: Python mode: cluster image: "${DATAPROC_IMAGE?}" imagePullPolicy: IfNotPresent mainApplicationFile: "local:///usr/lib/spark/examples/src/main/python/sql/arrow.py" sparkVersion: "3.1.3" restartPolicy: type: Never driver: cores: 1 coreLimit: "1000m" memory: "512m" serviceAccount: spark executor: cores: 1 instances: 1 memory: "512m"
Verifica que el ejemplo de especificación de
SparkApplication
se ejecute y complete en menos de un minuto con el siguiente comando:kubectl --kubeconfig AO_USER_KUBECONFIG get SparkApplication pyspark-sql-arrow -n foo
Spark MLlib
Sigue estos pasos para ejecutar Spark MLlib:
Usa el siguiente ejemplo de Scala para ejecutar una instancia de MLlib de Spark que realice un análisis estadístico y muestre un resultado en la consola:
import org.apache.spark.ml.linalg.{Matrix, Vectors} import org.apache.spark.ml.stat.Correlation import org.apache.spark.sql.Row val data = Seq( Vectors.sparse(4, Seq((0, 1.0), (3, -2.0))), Vectors.dense(4.0, 5.0, 0.0, 3.0), Vectors.dense(6.0, 7.0, 0.0, 8.0), Vectors.sparse(4, Seq((0, 9.0), (3, 1.0))) ) val df = data.map(Tuple1.apply).toDF("features") val Row(coeff1: Matrix) = Correlation.corr(df, "features").head println(s"Pearson correlation matrix:\n $coeff1") val Row(coeff2: Matrix) = Correlation.corr(df, "features", "spearman").head println(s"Spearman correlation matrix:\n $coeff2")
Aplica el siguiente ejemplo de especificación
SparkApplication
en el clúster de usuario:apiVersion: "sparkoperator.k8s.io/v1beta2" kind: SparkApplication metadata: name: spark-ml namespace: foo spec: type: Scala mode: cluster image: "${DATAPROC_IMAGE?}" imagePullPolicy: IfNotPresent mainClass: org.apache.spark.examples.ml.SummarizerExample mainApplicationFile: "local:///usr/lib/spark/examples/jars/spark-examples_2.12-3.1.3.jar" sparkVersion: "3.1.3" restartPolicy: type: Never driver: cores: 1 coreLimit: "1000m" memory: "512m" serviceAccount: spark executor: cores: 1 instances: 1 memory: "512m"
Verifica que el ejemplo de especificación de
SparkApplication
se ejecute y complete en menos de un minuto con el siguiente comando:kubectl --kubeconfig AO_USER_KUBECONFIG get SparkApplication spark-ml -n foo
SparkR
Sigue estos pasos para ejecutar SparkR:
Usa el siguiente código de ejemplo para ejecutar una instancia de SparkR que cargue un conjunto de datos incluido y que imprima la primera línea:
library(SparkR) sparkR.session() df <- as.DataFrame(faithful) head(df)
Aplica el siguiente ejemplo de especificación
SparkApplication
en el clúster de usuario:apiVersion: "sparkoperator.k8s.io/v1beta2" kind: SparkApplication metadata: name: spark-r-dataframe namespace: foo spec: type: R mode: cluster image: "${DATAPROC_IMAGE?}" imagePullPolicy: Always mainApplicationFile: "local:///usr/lib/spark/examples/src/main/r/dataframe.R" sparkVersion: "3.1.3" restartPolicy: type: Never driver: cores: 1 coreLimit: "1000m" memory: "512m" serviceAccount: spark executor: cores: 1 instances: 1 memory: "512m"
Verifica que el ejemplo de especificación de
SparkApplication
se ejecute y complete en menos de un minuto con el siguiente comando:kubectl --kubeconfig AO_USER_KUBECONFIG get SparkApplication spark-r-dataframe -n foo
Visualiza los registros de una aplicación de Spark 3
Spark tiene los siguientes dos tipos de registros que puedes visualizar:
Usa la terminal para ejecutar comandos.
Registros del conductor
Sigue estos pasos para ver los registros del controlador de tu aplicación de Spark:
Busca el pod del controlador de Spark:
kubectl -n spark get pods
Abre los registros del pod del controlador de Spark:
kubectl -n spark logs DRIVER_POD
Reemplaza
DRIVER_POD
por el nombre del pod del controlador de Spark que encontraste en el paso anterior.
Registros de eventos
Puedes encontrar los registros de eventos en la ruta de acceso especificada en el archivo YAML de la especificación SparkApplication
.
Sigue estos pasos para ver los registros de eventos de tu aplicación de Spark:
- Abre el archivo YAML de la especificación
SparkApplication
. - Ubica el campo
spec
en el archivo. - Busca el campo
sparkConf
anidado en el campospec
. - Ubica el valor del campo
spark.eventLog.dir
anidado en la secciónsparkConf
. - Abre la ruta para ver los registros de eventos.
Para ver un ejemplo de archivo YAML de la especificación SparkApplication
, consulta Escribe una especificación de aplicación de Spark.
Para obtener más información, comunícate con tu administrador de cuentas.