Nous construisons un système tolérant aux pannes en utilisant Spark Streaming et Kafka et nous testons le checkpointing spark streaming pour nous donner la possibilité de redémarrer le job spark s'il se plante pour une raison quelconque. Voici à quoi ressemble notre processus spark :
- Spark Streaming s'exécute toutes les 5 secondes (intervalle de glissement) pour lire les données de kafka
- Kafka reçoit environ 80 messages par seconde.
Ce que nous voulons, c'est une configuration qui nous permette d'arrêter le job de streaming spark (pour simuler une panne), puis de le redémarrer, tout en nous assurant que nous traitons tous les messages de Kafka. Cela semble fonctionner correctement, mais voici ce que je vois et dont je ne sais pas quoi faire :
- Après avoir redémarré le job Spark, un lot est créé pour tout le temps perdu. Ainsi, par exemple, si nous arrêtons et redémarrons après une minute, 12 lots sont créés (un pour chaque 5 secondes). Veuillez voir l'image ci-dessous
- Aucun de ces lots ne traite de données. Comme vous pouvez le voir dans l'image ci-dessous, ces lots ont une taille d'entrée = 0. Nous devons attendre que tous ces lots soient terminés avant que les lots contenant des données commencent à être traités. La situation s'aggrave si nous relançons le travail après quelques heures, car des centaines de lots sont créés qui ne traitent rien mais doivent être terminés.
Toute contribution à ce sujet sera appréciée :
- Est-ce attendu ? Pourquoi des lots sont-ils créés alors qu'ils ne traitent aucune donnée (le sujet kafka reçoit des messages en continu).
- Il y a aussi une deuxième chose qui prête à confusion. Après avoir arrêté le processus spark pendant une minute et l'avoir redémarré, il y a 4800 (80*60) messages dans le sujet kafka qui attendent d'être traités. Il semble que ces messages soient en cours de traitement, mais je ne vois aucun lot sur l'interface utilisateur dont la taille d'entrée est de 4800.