Puedes enviar un trabajo a un clúster existente de Managed Service para Apache Spark con una solicitud HTTP o programática de la API de jobs.submit, con la herramienta de línea de comandos de gcloud de Google Cloud CLI en una ventana de terminal local o en Cloud Shell, o desde la consola deGoogle Cloud abierta en un navegador local. También puedes establecer una conexión SSH con la instancia principal en tu clúster y, luego, ejecutar un trabajo directamente desde la instancia sin usar Managed Service para Apache Spark.
Simultaneidad de trabajos:
Puedes configurar la cantidad máxima de trabajos simultáneos de Managed Service para Apache Spark con la propiedad de clúster dataproc:dataproc.scheduler.max-concurrent-jobs cuando creas un clúster. Si no se configura este valor de propiedad, el límite superior en los trabajos simultáneos se calcula como max((masterMemoryMb - 3584) / masterMemoryMbPerJob, 5).
masterMemoryMb está determinado por el tipo de máquina de la VM principal.
masterMemoryMbPerJob es 1024 de forma predeterminada, pero se puede configurar durante la creación del clúster con la propiedad dataproc:dataproc.scheduler.driver-size-mb del clúster.
Cómo enviar un trabajo
Aislamiento de classpath y archivos JAR personalizados: No copies archivos JAR "fat" personalizados ni archivos JAR agrupados (como el tiempo de ejecución de Apache Iceberg o los paquetes de Google Cloud ) directamente en los directorios del sistema del clúster, como /usr/lib/spark/jars/. Colocar archivos JAR personalizados en directorios del sistema satura la ruta de clase del agente de Managed Service para Apache Spark con dependencias transitivas (como las bibliotecas de Guava o Hadoop) que entran en conflicto con las bibliotecas integradas del agente. Este conflicto puede provocar errores de resolución de clases (como ClassNotFoundException o NoClassDefFoundError) cuando se realizan operaciones de administración de trabajos, como la cancelación de un trabajo, lo que provoca que el agente falle y que las aplicaciones de YARN queden huérfanas.
En su lugar, usa uno de los siguientes enfoques admitidos:
- Dependencias específicas del trabajo: Especifica la ruta de acceso de Cloud Storage a tus archivos JAR cuando envíes el trabajo con la marca
--jarsen Google Cloud CLI, el campo Archivos JAR en la consola de Google Cloud o el campojarFileUrisen la API. Spark distribuye las dependencias al controlador y a los ejecutores del trabajo sin contaminar la ruta de clase del agente. - Dependencias en todo el clúster: Especifica las dependencias durante la creación del clúster con la propiedad del clúster
spark:spark.jars: Esto indica a Managed Service para Apache Spark que configure--properties="spark:spark.jars=gs://YOUR_BUCKET/jar-1.jar,gs://YOUR_BUCKET/jar-2.jar"
/etc/spark/conf/spark-defaults.conf, distribuyendo automáticamente las dependencias a las rutas de acceso de clase del controlador y del ejecutor de Spark para todos los trabajos, a la vez que deja aislado de forma limpia el agente de Managed Service para Apache Spark local del nodo.
Console
Abre la página Enviar un trabajo de Managed Service para Apache Spark en la consola de Google Cloud en tu navegador.
Ejemplo de un trabajo de Spark
Para enviar un ejemplo de trabajo de Spark, completa los campos en la página Submit a job de la siguiente manera:
- En Clúster (Cluster), selecciona el nombre del clúster que quieres elegir de la lista.
- Establece Tipo de trabajo (Job type) en
Spark. - Establece Clase principal o jar (Main class or jar) en
org.apache.spark.examples.SparkPi. - Establece Argumentos (Arguments) en un argumento único
1000. - Agrega
file:///usr/lib/spark/examples/jars/spark-examples.jara Archivos JAR (o al campojarFileUrisde la API):file:///denota un esquema LocalFileSystem de Hadoop. Managed Service para Apache Spark instaló/usr/lib/spark/examples/jars/spark-examples.jaren el nodo principal del clúster cuando creó el clúster. Esta ruta de acceso solo se usa para los ejemplos preinstalados que proporciona Managed Service para Apache Spark. No copies archivos JAR personalizados en directorios del sistema (consulta la advertencia en Cómo enviar un trabajo).- Como alternativa, puedes especificar una ruta de Cloud Storage (
gs://your-bucket/your-jarfile.jar) o una ruta del sistema de archivos distribuido de Hadoop (hdfs://path-to-jar.jar) a uno de tus archivos jar. (Si envías el trabajo con la API, especifica esta ruta de acceso en el campojarFileUris).
Haz clic en Submit (Enviar) para iniciar el trabajo. Una vez que se inicia el trabajo, se agrega a la lista Jobs (Trabajos).
Haz clic en el ID de trabajo para abrir la página Trabajos, en la que podrás ver el resultado del controlador del trabajo. Este trabajo produce líneas de salida extensas que superan el ancho de la ventana del navegador, por lo que puedes marcar el cuadro Ajuste de línea (Line wrapping) para mostrar todo el texto de salida del resultado calculado de pi.
Puedes ver el resultado del controlador de trabajos desde la línea de comandos con gcloud dataproc jobs wait que se muestra a continuación. Para obtener más información, consulta Cómo ver el resultado del trabajo: COMANDO DE GCLOUD.
Copia y pega tu ID del proyecto como el valor de la marca --project y tu ID de trabajo (que aparece en la lista de trabajos) como argumento final.
gcloud dataproc jobs wait job-id \ --project=project-id \ --region=region
Aquí hay fragmentos del resultado del controlador para el trabajo de muestra de SparkPi:
... 2015-06-25 23:27:23,810 INFO [dag-scheduler-event-loop] scheduler.DAGScheduler (Logging.scala:logInfo(59)) - Stage 0 (reduce at SparkPi.scala:35) finished in 21.169 s 2015-06-25 23:27:23,810 INFO [task-result-getter-3] cluster.YarnScheduler (Logging.scala:logInfo(59)) - Removed TaskSet 0.0, whose tasks have all completed, from pool 2015-06-25 23:27:23,819 INFO [main] scheduler.DAGScheduler (Logging.scala:logInfo(59)) - Job 0 finished: reduce at SparkPi.scala:35, took 21.674931 s Pi is roughly 3.14189648 ... Job [c556b47a-4b46-4a94-9ba2-2dcee31167b2] finished successfully. driverOutputUri: gs://sample-staging-bucket/google-cloud-dataproc-metainfo/cfeaa033-749e-48b9-... ...
gcloud
Para enviar un trabajo a un clúster de Managed Service para Apache Spark, ejecuta el comando gcloud dataproc jobs submit de gcloud CLI de manera local en una ventana de la terminal o en Cloud Shell.
gcloud dataproc jobs submit job-command \ --cluster=cluster-name \ --region=region \ other dataproc-flags \ -- job-args
- Muestra el archivo
hello-world.pyde acceso público ubicado en Cloud Storage. A continuación, se muestra la lista de archivos:gcloud storage cat gs://dataproc-examples/pyspark/hello-world/hello-world.py
#!/usr/bin/python import pyspark sc = pyspark.SparkContext() rdd = sc.parallelize(['Hello,', 'world!']) words = sorted(rdd.collect()) print(words)
- Envía el trabajo de PySpark a Managed Service para Apache Spark.
A continuación, se muestra el resultado de la terminal:gcloud dataproc jobs submit pyspark \ gs://dataproc-examples/pyspark/hello-world/hello-world.py \ --cluster=cluster-name \ --region=region
Waiting for job output... … ['Hello,', 'world!'] Job finished successfully.
- Ejecuta el ejemplo de SparkPi preinstalado en el nodo principal del clúster de Managed Service para Apache Spark. (La ruta de acceso
file:///usr/lib/spark/examples/jars/spark-examples.jares solo para ejemplos preinstalados; para las dependencias de JAR personalizadas, consulta la advertencia en Cómo enviar un trabajo). A continuación, se muestra el resultado de la terminal:gcloud dataproc jobs submit spark \ --cluster=cluster-name \ --region=region \ --class=org.apache.spark.examples.SparkPi \ --jars=file:///usr/lib/spark/examples/jars/spark-examples.jar \ -- 1000
Job [54825071-ae28-4c5b-85a5-58fae6a597d6] submitted. Waiting for job output… … Pi is roughly 3.14177148 … Job finished successfully. …
REST
En esta sección, se muestra cómo enviar un trabajo de Spark para calcular el valor aproximado de pi con la API de jobs.submit de Managed Service para Apache Spark.
Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:
- project-id: Google Cloud ID del proyecto
- region: región del clúster
- clusterName: nombre del clúster
Método HTTP y URL:
POST https://dataproc.googleapis.com/v1/projects/project-id/regions/region/jobs:submit
Cuerpo JSON de la solicitud:
{
"job": {
"placement": {
"clusterName": "cluster-name"
},
"sparkJob": {
"args": [
"1000"
],
"mainClass": "org.apache.spark.examples.SparkPi",
"jarFileUris": [
"file:///usr/lib/spark/examples/jars/spark-examples.jar"
]
}
}
}
Para enviar tu solicitud, expande una de estas opciones:
Deberías recibir una respuesta JSON similar a la que se muestra a continuación:
{
"reference": {
"projectId": "project-id",
"jobId": "job-id"
},
"placement": {
"clusterName": "cluster-name",
"clusterUuid": "cluster-Uuid"
},
"sparkJob": {
"mainClass": "org.apache.spark.examples.SparkPi",
"args": [
"1000"
],
"jarFileUris": [
"file:///usr/lib/spark/examples/jars/spark-examples.jar"
]
},
"status": {
"state": "PENDING",
"stateStartTime": "2020-10-07T20:16:21.759Z"
},
"jobUuid": "job-Uuid"
}
Java
Python
Go
- Instala la biblioteca cliente
- Configura credenciales predeterminadas de la aplicación
- Ejecuta el código. .
Node.js
Envía un trabajo directamente en tu clúster
Si deseas ejecutar un trabajo directamente en tu clúster sin usar el servicio administrado para Apache Spark, establece una conexión SSH al nodo principal de tu clúster y, luego, ejecuta el trabajo en el nodo principal.
Luego de establecer una conexión SSH a la instancia principal de VM, ejecuta comandos en una ventana de terminal en el nodo principal del clúster para realizar las siguientes acciones:
- Abrir una shell de Spark
- Ejecutar un trabajo de Spark para contar la cantidad de líneas en un archivo "hello-world" de Python (de siete líneas) ubicado en un archivo accesible de manera pública en Cloud Storage
Salir de la shell
user@cluster-name-m:~$ spark-shell ... scala> sc.textFile("gs://dataproc-examples" + "/pyspark/hello-world/hello-world.py").count ... res0: Long = 7 scala> :quit
Ejecuta trabajos de Bash en Managed Service para Apache Spark
Es posible que desees ejecutar una secuencia de comandos Bash como tu trabajo de Managed Service para Apache Spark, ya sea porque los motores que usas no son compatibles como un tipo de trabajo de Managed Service para Apache Spark de nivel superior o porque necesitas realizar una configuración o cálculo adicional de argumentos antes de iniciar un trabajo con hadoop o spark-submit desde tu secuencia de comandos.
Ejemplo de pig
Supongamos que copiaste una secuencia de comandos bash hello.sh en Cloud Storage:
gcloud storage cp hello.sh gs://${BUCKET}/hello.shDado que el comando pig fs usa rutas de Hadoop, copia la secuencia de comandos de Cloud Storage en un destino especificado como file:/// para asegurarte de que esté en el sistema de archivos local, en lugar de HDFS. Los comandos sh posteriores hacen referencia al sistema de archivos local de forma automática y no requieren el prefijo file:///.
gcloud dataproc jobs submit pig --cluster=${CLUSTER} --region=${REGION} \
-e='fs -cp -f gs://${BUCKET}/hello.sh file:///tmp/hello.sh; sh chmod 750 /tmp/hello.sh; sh /tmp/hello.sh'De manera alternativa, como los trabajos de Managed Service para Apache Spark envían un archivo a etapa de argumento --jars en un directorio temporal creado durante la vida útil del trabajo, puedes especificar tu secuencia de comandos de shell de Cloud Storage como argumento --jars:
gcloud dataproc jobs submit pig --cluster=${CLUSTER} --region=${REGION} \
--jars=gs://${BUCKET}/hello.sh \
-e='sh chmod 750 ${PWD}/hello.sh; sh ${PWD}/hello.sh'Ten en cuenta que el argumento --jars también puede hacer referencia a una secuencia de comandos local:
gcloud dataproc jobs submit pig --cluster=${CLUSTER} --region=${REGION} \
--jars=hello.sh \
-e='sh chmod 750 ${PWD}/hello.sh; sh ${PWD}/hello.sh'