Debugging avec la Spark UI
Cet article décrit quelques options de debugging disponibles pour votre application Apache Spark :
- Interface utilisateur Spark
- Logs du Driver
- Logs d'exécuteur
Consultez Diagnostiquer les problèmes de coût et de performance à l'aide de la Spark UI pour vous guider dans le diagnostic des problèmes de coût et de performance à l'aide de la Spark UI.
Spark UI
Une fois que vous start un Job, la Spark UI affiche des informations sur ce qui se passe dans votre application. Pour accéder à la Spark UI, sélectionnez votre compute à partir de la page Compute , puis cliquez sur l'onglet Spark UI :

Tab Streaming
Dans la Spark UI, vous verrez un tab Streaming si un job de streaming s'exécute sur le compute. S'il n'y a pas de job de streaming s'exécutant sur ce compute, ce tab n'est pas visible. Vous pouvez passer à Driver Logs pour savoir comment vérifier les exceptions qui auraient pu se produire lors du démarrage de la streaming Job.
Cette page vous permet de vérifier si votre application de streaming reçoit des événements d'entrée depuis votre source. Par exemple, il se peut que vous constatiez que le Job reçoit 1 000 événements/seconde.
TextFileStreamPour, puisque des fichiers sont en entrée, le nombre d'événements d'entrée est toujours de 0. Dans de tels cas, vous pouvez consulter la section **Completed Batches** du Notebook pour savoir comment trouver plus d'information.
Si vous avez une application qui reçoit plusieurs Stream d'entrée, vous pouvez cliquer sur le Link Taux d'entrée qui affichera le nombre d'événements reçus pour chaque récepteur.
Temps de traitement
En faisant défiler vers le bas, trouvez le Graphe pour **Temps de traitement**. Ceci est l'un des graphes clés pour comprendre les performances de votre job de streaming. En règle générale, il est préférable de pouvoir traiter chaque batch dans les 80 % de votre temps de traitement par batch.
Si le temps de traitement moyen est plus proche ou supérieur à votre intervalle de traitement par batch, vous aurez une application de streaming qui commencera bientôt à s'accumuler, ce qui peut éventuellement faire échouer votre job de streaming.
Batchs terminés
Vers la fin de la page, vous verrez une liste de tous les batches terminés. La page affiche les détails concernant les 1 000 derniers batchs qui se sont terminés. À partir du tableau, vous pouvez obtenir le nombre d'événements traités pour chaque batch et leur temps de traitement. Si vous voulez en savoir plus sur ce qui s'est passé sur l'un des batchs, vous pouvez cliquer sur le Link du batch pour accéder à la page Détails du batch .
Page de détails du batch
La page **Détails du batch** contient tous les détails concernant un batch. Deux choses clés sont :
- Entrée : Contient des détails sur l'entrée du batch. Dans ce cas, il contient des détails sur le sujet, la partition et les offsets Apache Kafka lus par Spark Structured Streaming pour ce batch. Dans le cas de TextFileStream, vous voyez une liste de noms de fichiers qui a été lue pour ce batch. C'est le meilleur moyen de start le débogage d'une application de streaming lisant des fichiers texte.
- Traitement : Vous pouvez cliquer sur le Link vers l'ID de Job qui contient tous les détails sur le traitement effectué pendant ce batch.
Page des détails du Job
La page de détails du Job affiche une visualisation DAG. Ceci est utile pour comprendre l'ordre des opérations et les dépendances pour chaque batch. Par exemple, cela pourrait montrer qu'une entrée de lecture par batch à partir d'un stream direct Kafka, suivie d'une opération de flat map puis d'une opération de map, et que le stream résultant a ensuite été utilisé pour mettre à jour un état global à l'aide de updateStateByKey.
Les cases grisées représentent les étapes ignorées. Spark est suffisamment intelligent pour ignorer certaines étapes si elles n'ont pas besoin d'être recalculées. Si les données sont checkpointées ou mises en cache, alors Spark ignore le recalcul de ces étapes. Dans l'exemple de streaming précédent, ces étapes correspondent à la dépendance vis-à-vis des batchs précédents en raison de updateStateBykey. Puisque Spark Structured Streaming checkpointe le Stream en interne et qu'il lit à partir du checkpoint au lieu de dépendre des batches précédents, ils sont affichés comme des étapes grisées.
En bas de la page, vous trouverez également la liste des Jobs qui ont été exécutés pour ce batch. Vous pouvez cliquer sur les liens dans la description pour examiner plus en détail l'exécution au niveau de la tâche.
Page des détails de la tâche
Il s'agit du niveau de debugging le plus granulaire auquel vous pouvez accéder depuis la Spark UI pour une application Spark. Cette page contient toutes les tâches qui ont été exécutées pour ce batch. Si vous examinez les problèmes de performance de votre application de streaming, cette page fournit des informations telles que le nombre de tâches exécutées et leur emplacement d'exécution (sur quels exécuteurs), ainsi que des informations de brassage (shuffle).
Assurez-vous que les tâches sont exécutées sur plusieurs exécuteurs (nœuds) dans votre compute pour bénéficier d'un parallélisme suffisant pendant le traitement. Si vous avez un seul récepteur, il peut arriver qu'un seul exécuteur effectue tout le travail, même si vous avez plusieurs exécuteurs dans votre compute.
Vidage de thread
Un vidage de thread affiche un instantané des états des threads d'une JVM.
Les thread dumps sont utiles pour le debugging d’une tâche spécifique bloquée ou lente. Pour afficher un thread dump d'une tâche spécifique dans la Spark UI :
- Cliquez sur l'onglet tab .
- Dans le tableau Jobs , trouvez le job cible qui correspond au thread dump que vous souhaitez consulter, et cliquez sur le Link dans la colonne Description .
- Dans le tableau Stages du Job, recherchez l'étape cible qui correspond au vidage de thread que vous souhaitez afficher, et cliquez sur le Link dans la colonne Description .
- Dans la liste des Tâches de l'étape, recherchez la tâche cible qui correspond au thread dump que vous souhaitez voir, et notez ses valeurs d' ID de Tâche et d' ID d'Exécuteur .
- Cliquez sur l'onglet Exécuteurs .
- Dans le tableau Executors , recherchez la ligne qui contient la valeur Executor ID qui correspond à la valeur Executor ID que vous avez notée précédemment. Dans cette ligne, cliquez sur le Link dans la colonne Thread Dump .
- Dans le tableau Thread dump de l'exécuteur, cliquez sur la ligne où la colonne Thread Name contient TID suivi de la valeur Task ID que vous avez notée précédemment. (Si la tâche a terminé son exécution, vous ne trouverez pas de thread correspondant). Le thread dump de la tâche est affiché.
Les dumps de threads sont également utiles pour le debugging des problèmes où le driver semble bloqué (par exemple, aucune barre de progression Spark n'apparaît) ou ne fait aucun progrès sur les queries (par exemple, les barres de progression Spark sont bloquées à 100 %). Pour afficher le dump de thread du driver dans la Spark UI :
- Cliquez sur l'onglet Exécuteurs .
- Dans la table Executors , dans la ligne du driver , cliquez sur le Link dans la colonne Thread Dump . Le thread dump du driver est affiché.
Driver Logs
Les Logs du Driver sont utiles dans les cas suivants :
- Exceptions : parfois, il se peut que vous ne voyiez pas la tab Streaming dans la Spark UI. C'est parce que le job de streaming n'a pas démarré en raison d'une exception. Vous pouvez approfondir les Logs du Driver pour consulter la trace de la pile de l’exception. Dans certains cas, le job de streaming peut avoir démarré correctement. Mais vous verrez que tous les batchs ne vont jamais à la section des batchs terminés. Ils pourraient tous être en cours de traitement ou en échec. Dans ces cas, les Driver Logs sont également utiles pour comprendre la nature des problèmes sous-jacents.
- Impressions : toute instruction d'impression faisant partie du DAG apparaît également dans les logs.
Qui peut accéder aux Logs du Driver dépend du mode d'accès de la Ressource de compute. Pour les computes avec le mode d'accès **Standard**, seuls les administrateurs du Workspace peuvent accéder aux Logs du Driver. Pour les computes avec le mode d'accès **Dedicated**, l'utilisateur ou le groupe dédié et les administrateurs du Workspace peuvent accéder aux Logs du Driver.
Logs de l'exécuteur
Les logs de l'exécuteur sont utiles si vous constatez que certaines tâches ne se comportent pas correctement et que vous souhaitez consulter les logs de tâches spécifiques. À partir de la page des détails de la tâche affichée ci-dessus, vous pouvez obtenir l'exécuteur où la tâche a été exécutée. Une fois que vous avez cela, vous pouvez accéder à la page de l'interface utilisateur de compute, cliquer sur # nœuds, puis sur le maître. La page principale répertorie tous les Workers. Vous pouvez choisir le Worker sur lequel la tâche suspecte a été exécutée, puis accéder à la sortie log4j.
Les logs de l'exécuteur ne sont pas disponibles pour les compute avec le mode d'accès Standard . Pour les computes avec le mode d'accès Dédié , l'utilisateur ou le groupe dédié et les administrateurs du Workspace peuvent accéder aux logs de l'exécuteur.