Pregunta ¿Cómo puedo depurar la aplicación de chispa localmente?


Soy muy nuevo en la chispa y solo me gustaría aprender paso a paso cómo depurar una aplicación de chispa localmente. ¿Alguien podría detallar los pasos necesarios para hacer esto?

Puedo ejecutar localmente la aplicación Simple en el sitio web de chispa desde la línea de comandos, pero solo necesito pasar por el código y ver cómo funciona. Cualquier ayuda es muy apreciada. Gracias.


32
2018-05-22 18:37


origen


Respuestas:


Como David Griffin mencionó, usando spark-shell puede ser muy útil. Sin embargo, considero que hacer una depuración local real, establecer puntos de corte, inspeccionar variables, etc. es indispensable. Así es como lo hago usando IntelliJ.

Primero, asegúrese de que puede ejecutar su aplicación de chispa localmente usando spark-submit, p.ej. algo como:

spark-submit --name MyApp --class MyMainClass --master local[2] myapplication.jar

Luego, pídele a tu conductor de chispa local que pause y espere la conexión de un depurador cuando se inicie, agregando una opción como la siguiente:

--conf spark.driver.extraJavaOptions=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005

dónde agentlib:jdwp es la opción de Java Debug Wire Protocol, seguida de una lista de subopciones separadas por comas:

  • transport define el protocolo de conexión utilizado entre depurador y depurador, ya sea socket o "memoria compartida", casi siempre quiere un socket (dt_socket) excepto que creo en algunos casos en Microsoft Windows
  • server si este proceso debe ser el servidor cuando se habla con el depurador (o, por el contrario, el cliente), siempre necesita un servidor y un cliente. En este caso, vamos a ser el servidor y esperar una conexión del depurador
  • suspend si pausar la ejecución hasta que un depurador se haya conectado correctamente. Encendemos esto para que el controlador no se inicie hasta que el depurador se conecte
  • address aquí, este es el puerto para escuchar (para las solicitudes de conexión del depurador). Puede configurarlo en cualquier puerto disponible (solo debe asegurarse de que el depurador esté configurado para conectarse a este mismo puerto)

Entonces ahora, tu spark-submit la línea de comando debería verse algo así como:

spark-submit --name MyApp --class MyMainClass --master local[2] --conf spark.driver.extraJavaOptions=agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005

Ahora si ejecuta lo anterior, debería ver algo como

Listening for transport dt_socket at address: 5005

y su aplicación de chispa está esperando que se adjunte el depurador.

A continuación, abra el proyecto IntelliJ que contiene su aplicación Spark, y luego abra "Ejecutar -> Editar configuraciones ..." Luego haga clic en "+" para agregar una nueva configuración de ejecución / depuración y seleccione "Remoto". Ponle un nombre, p. "SparkLocal", y seleccione "Socket" para Transport, "Attach" para el modo Debugger, y escriba "localhost" para Host y el puerto que utilizó anteriormente para Puerto, en este caso, "5005". Haga clic en "Aceptar" para guardar.

En mi versión de IntelliJ, le da sugerencias para usar la línea de comandos de depuración para el proceso depurado, y usa "suspender = n" - ignoramos eso y usamos "suspender = y" (como se indicó anteriormente) porque queremos la aplicación para esperar hasta que nos conectamos para comenzar.

Ahora deberías estar listo para depurar. Simplemente inicie la chispa con el comando anterior, luego seleccione la configuración de ejecución de IntelliJ que acaba de crear y haga clic en Depurar. IntelliJ debería conectarse a su aplicación Spark, que ahora debería comenzar a funcionar. Puede establecer puntos de interrupción, inspeccionar variables, etc.


14
2018-04-15 13:21



Enciende la carcasa Spark. Esto es directo de Documentación de chispas:

./bin/spark-shell --master local[2]

También verá la carcasa de chispa conocida como REPL. Es, de lejos, la mejor forma de aprender Spark. Paso el 80% de mi tiempo en el shell Spark y el otro 20% traduciendo el código en mi aplicación.


9
2018-05-23 05:09



Simplemente pase las opciones de java para abrir el puerto de depuración. Este es un buen artículo que aborda su pregunta: http://danosipov.com/?p=779 Lo estoy usando como

$ SPARK_JAVA_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 spark-shell

(Sí, SPARK_JAVA_OPTS está en desuso, pero funciona bien)


7
2017-11-24 08:39



La respuesta de Jason Evans no funcionó para mí. Pero

--conf spark.driver.extraJavaOptions=-Xrunjdwp:transport=dt_socket,server=y,address=8086,suspend=n

trabajó


3
2017-11-29 01:32



solo se necesita un pequeño cambio para la respuesta de @Jason Evan. Necesita un '-' before the String "agentlib ...."

 --conf spark.driver.extraJavaOptions=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005

también puede usar la opción "--driver-java-options" para lograr el mismo propósito

--driver-java-options -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005

2
2018-02-13 09:29



puedes probar esto en spark-env.sh:

SPARK_SUBMIT_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8888


0
2017-07-30 14:11