Le code ci-dessous est créé avec succès dans le contexte Spark lorsque je soumets en utilisant
spark submit
et fonctionne correctement.
Quand je tue l'application sous Running Applications
à partir d'Apache spark
interface utilisateur Web, l'état de l'application indique tué
mais, impression de application de test
à l'écran après avoir tué également:
Application exécutée sur l'interface utilisateur Web apache spark: p >
Application tuée à l'aide du bouton" kill "sur l'interface utilisateur Web Spark
Toujours imprimer le message à l'écran après avoir tué l'application
from pyspark import SparkConf from pyspark import SparkContext if __name__ == "__main__": conf = SparkConf().setAppName("TEST") conf.set("spark.scheduler.mode", "FAIR") sc = SparkContext(conf=conf) while True: print("Test application")
3 Réponses :
Vous pouvez le faire à l'ancienne.
Exécutez ps -ef et trouvez l'ID de la tâche java. Puis lancez kill -9
//Find all the java jobs [stack_overflow@stack_overflow ~]$ ps -ef | grep SparkSubmit stack_overflow 96747 96736 99 11:19 pts/15 00:01:55 /usr/bin/java -cp /opt/spark/conf/:/opt/spark/jars/* -Dscala.usejavacp=true -Xmx1g -Dderby.system.home=/home/stack_overflow/Spark/ org.apache.spark.deploy.SparkSubmit --conf spark.local.dir=/opt/spark/temp_land/spark-temp --conf spark.driver.extraJavaOptions=-Dderby.system.home=/home/stack_overflow/ --class org.apache.spark.repl.Main --name Spark shell spark-shell stack_overflow 97410 14952 0 11:20 pts/15 00:00:00 grep --color=auto SparkSubmit //96747 is the Spark job I forced to become unresponsive //97410 is the Base Spark Account don't delete ////Run the kill command on the job, only works if you have permissions on that job [stack_overflow@stack_overflow ~]$ kill -9 96747 //The job is now dead and gone [stack_overflow@stack_overflow ~]$ ps -ef | grep SparkSubmit stack_overflow 96190 14952 0 11:17 pts/15 00:00:00 grep --color=auto SparkSubmit
Merci pour la réponse. Puis-je gérer dans le programme python? Raison: en production, je peux être en mesure de soumettre plusieurs jobs Spark jobs et chaque job contient un sparkcontext séparé. Je m'attends à ce que si je tue la session de contexte Spark sur l'interface utilisateur Spark, cela devrait tuer toute l'exécution de l'application.
Disons que je lance 10 travaux Spark chacun avec leur propre SparkContext, puis ils devraient chacun avoir leur propre PID ou Job_ID à tuer. Pour votre question, non, vous pouvez tuer directement depuis Spark (chaque fois que le travail devient aberrant) comme vous l'avez vu et ne meurt pas. Cependant, si vous êtes intéressé, vous pouvez configurer un observateur pour tuer sur commande. (1) À partir d'un programme de haut niveau, obtenez un programme pour regarder un dossier, vérifiez toutes les 2 secondes et mettez en veille, (2) Lorsque vous créez votre SparkContext, donnez-lui un App_Name unique, (3) Lorsque vous voulez qu'il soit tué, utilisez java. file.io pour placer un fichier dans le dossier avec le nom App Name.
L'observateur analyse le nom de l'application l'utilise dans le grep ci-dessus, identifie le pid et le tue. Désolé, il n'y a vraiment pas de moyen facile de supprimer ces emplois de manière dynamique dans Spark.
Merci pour les détails. Ci-dessous, j'ai posté le code, cela a fonctionné pour moi.
Vous pouvez ouvrir une autre session et voir si votre application Spark est toujours en cours d'exécution -
yarn application -kill <app_id>
puis tuer votre application si elle est toujours en cours d'exécution,
yarn application -list <app_id>
Merci Ajay pour la réponse. Je n'utilise pas de fil ici, l'exception est de gérer par programme
Je ne suis pas sûr, mais vous pouvez essayer d'utiliser le crochet d'arrêt pour arrêter correctement l'application. Bonne chance.
J'ai trouvé un moyen de résoudre mon problème avec le code ci-dessous. Merci pour toutes vos réponses
from pyspark import SparkConf from pyspark import SparkContext if __name__ == "__main__": conf = SparkConf().setAppName("TEST") conf.set("spark.scheduler.mode", "FAIR") sc = SparkContext(conf=conf) while True: if sc._jsc.sc().isStopped(): break print("Test application")
Exécutez-vous Spark Application sur Yarn. Si oui, supprimez-le de Yarn en utilisant la commande "Yarn application -kill"
Soumettre manuellement via l'éditeur de commande spark-submit test_spark.py et je peux voir la sortie d'impression sur le même éditeur de commande.