web-dev-qa-db-fra.com

Comment puis-je déboguer une application spark localement?

Je suis très nouveau pour déclencher et je voudrais juste apprendre, étape par étape, comment déboguer une application d'allumage localement? Quelqu'un pourrait-il s'il vous plaît détailler les étapes nécessaires pour faire cela? 

Je peux exécuter l'application simpleApp sur le site Web d'allumage localement à partir de la ligne de commande, mais je dois simplement parcourir le code et voir comment il fonctionne. Toute aide est fortement appréciée. Je vous remercie. 

36
ekardes

Comme David Griffin l’a mentionné, utiliser spark-Shell peut être très utile. Cependant, je trouve que le débogage local réel, la définition de points d'arrêt, l'inspection de variables, etc. sont indispensables. Voici comment je le fais en utilisant IntelliJ.

Tout d’abord, assurez-vous que vous pouvez exécuter votre application spark localement à l’aide de spark-submit, par exemple. quelque chose comme:

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

Ensuite, demandez à votre pilote d’étincelle local de mettre en pause et d’attendre la connexion d’un débogueur lorsqu’il démarre, en ajoutant une option comme celle-ci:

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

agentlib:jdwp correspond à l'option Java Debug Wire Protocol, suivie d'une liste de sous-options séparées par des virgules:

  • transport définit le protocole de connexion utilisé entre le débogueur et le débogage - soit socket, soit "mémoire partagée" - vous voulez presque toujours socket (dt_socket), sauf dans certains cas sous Microsoft Windows.
  • server si ce processus doit être le serveur lorsque vous parlez au débogueur (ou inversement, le client) - vous avez toujours besoin d'un serveur et d'un client. Dans ce cas, nous allons être le serveur et attendre une connexion du débogueur
  • suspend s'il faut suspendre l'exécution jusqu'à ce qu'un débogueur se soit connecté avec succès. Nous activons cette option pour que le pilote ne démarre pas tant que le débogueur ne se connecte pas.
  • address ici, il s'agit du port sur lequel écouter (pour les demandes de connexion de débogueur entrantes). Vous pouvez le configurer sur n'importe quel port disponible (vous devez simplement vous assurer que le débogueur est configuré pour se connecter à ce même port)

Alors maintenant, votre ligne de commande spark-submit devrait ressembler à ceci:

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

Maintenant, si vous exécutez ce qui précède, vous devriez voir quelque chose comme

Listening for transport dt_socket at address: 5005

et votre application spark attend que le débogueur s'attache.

Ensuite, ouvrez le projet IntelliJ contenant votre application Spark, puis cliquez sur "Exécuter -> Modifier les configurations ...". Cliquez ensuite sur le "+" pour ajouter une nouvelle configuration d'exécution/de débogage, puis sélectionnez "À distance". Donnez-lui un nom, par exemple "SparkLocal", sélectionnez "Socket" pour le transport, "Attachez" pour le mode débogueur, puis saisissez "localhost" pour l'hôte et le port utilisé ci-dessus pour le port, dans ce cas, "5005". Cliquez sur "OK" pour sauvegarder. 

Dans ma version d'IntelliJ, il vous propose des suggestions d'utilisation de la ligne de commande debug pour le processus débogué. Il utilise "suspend = n". Nous l'ignorons et utilisons "suspend = y" (comme ci-dessus) car nous souhaitons l'application à attendre jusqu'à ce que nous nous connectons pour démarrer.

Vous devriez maintenant être prêt à déboguer. Il suffit de démarrer spark avec la commande ci-dessus, puis sélectionnez la configuration d'exécution IntelliJ que vous venez de créer et cliquez sur Déboguer. IntelliJ devrait se connecter à votre application Spark, qui devrait maintenant commencer à s'exécuter. Vous pouvez définir des points d'arrêt, inspecter des variables, etc.

19
Jason Evans

Lancez l'étincelle. Ceci provient directement de la documentation Spark :

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

Vous verrez également le shell Spark appelé REPL. C'est de loin le meilleur moyen d'apprendre Spark. Je passe 80% de mon temps dans Spark Shell et les 20% restants à traduire le code dans mon application.

10
David Griffin

Il suffit de passer les options Java pour ouvrir le port de débogage. Voici un bel article qui répond à votre question - http://danosipov.com/?p=779 Je l'utilise comme

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

(oui, SPARK_Java_OPTS est obsolète, mais cela fonctionne bien)

7
Vladimir Rozhkov

La réponse de @Jason Evans n'a pas fonctionné pour moi. Mais 

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

travaillé

3
Jian Yang

un seul changement mineur est nécessaire pour la réponse de @Jason Evan. Il faut un «-» avant la chaîne "agentlib ...."

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

vous pouvez également utiliser l'option "--driver-Java-options" pour atteindre le même objectif

--driver-Java-options -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005
1
ryan

vous pouvez essayer ceci dans spark-env.sh:

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

0
Ingram

Choisissez d'abord une version de spark puis choisissez un IDE, intellij serait mieux. Vérifiez le code source de cette version spark et assurez-vous que vous pouvez le construire avec succès à partir de l'IDE (plus ici ) une fois que vous avez une version propre, recherchez les cas de test ou les suites de tests. Par exemple, "SubquerySuite" est simple, puis corrigez-le comme une application normale. Commentez les étapes spécifiques pour lesquelles vous avez besoin d'aide

0
Hemanth meka