Apache Spark est un moteur de calcul distribué pour le traitement et l'analyse de données à grande échelle. Sa puissance repose sur une séparation claire des responsabilités entre le driver, les executors et un gestionnaire de cluster, ainsi que sur un modèle d'exécution résilient qui transforme le code utilisateur en étapes de tâches parallèles. Cet article explique comment les composants de Spark s'articulent, comment les flux de contrôle et de données circulent dans un job, et comment exécuter un pilote pratique et à faible risque que vous pouvez vérifier de bout en bout. ## Ce Que Vous Allez Apprendre - Les principaux composants de Spark et leurs responsabilités opérationnelles - Comment le flux de contrôle (planification et ordonnancement) et le flux de données (shuffles, broadcasts) fonctionnent en pratique - Un chemin de configuration sûr pour exécuter un job petit mais réaliste - Les étapes de vérification à l'aide de l'interface utilisateur Spark et de contrôles de données simples - Les modes de défaillance courants et les actions de récupération précises - Une liste de contrôle opérationnelle pratique que vous pouvez appliquer à chaque job Ce guide s'adresse aux développeurs, consultants DevOps et équipes techniques de startups qui doivent déployer des jobs Spark de manière fiable, raisonner sur la performance et récupérer rapidement en cas de problème. ## Composants Spark en Un Coup d'Œil Le tableau suivant résume les composants d'exécution principaux et ce qu'il faut surveiller opérationnellement.
| Composant | Rôle | Préoccupations Opérationnelles |
|---|---|---|
| Driver | Orchestre l'application : crée la SparkSession, construit les plans logiques/physiques, planifie les étapes et les tâches, suit les métadonnées | Éviter les OOM du driver via un travail côté executor, limiter collect() sur les gros volumes, s'assurer que la mémoire et le CPU du driver sont suffisants |
| Executors | Exécutent les tâches, mettent en cache les données, effectuent les shuffles et les écritures, renvoient l'état au driver | Définir cœurs et mémoire par executor de manière appropriée, éviter les OOM d'executor, surveiller le GC et les spills sur disque |
| Gestionnaire de Cluster | Alloue les ressources à l'application Spark (Standalone, YARN, Kubernetes) | Capacité des files d'attente, limites d'application, préemption, santé des nœuds |
| Stockage Externe | Systèmes d'entrée et de sortie (HDFS, stockage objet, puits JDBC) | Débit, cohérence, protocole de commit de sortie, partitionnement et évolution de schéma |
| Domaine | Paramètre | Exemple Construit |
|---|---|---|
| Executors | spark.executor.instances | 9 (3 par worker) |
| Executors | spark.executor.cores | 2 |
| Executors | spark.executor.memory | 14g |
| Executors | spark.executor.memoryOverhead | 3g |
| Parallélisme | spark.default.parallelism | 48 |
| Shuffles | spark.sql.shuffle.partitions | 64 |
| AQE | spark.sql.adaptive.enabled | true |
| Jointures | spark.sql.autoBroadcastJoinThreshold | 64m |
| Spéculation | spark.speculation | false |
| Alloc. dynamique | spark.dynamicAllocation.enabled | false |