Aller au contenu

Quiz 10 – ML en streaming, Catalyst, Tungsten, AQE et architectures Lambda / Kappa

  • Jour 3
  • 20 questions
  • Seuil de réussite : 70 %
  • 20 flashcards

Contenus évalués : application d'un `PipelineModel` sauvegardé sur un flux avec `transform` et `foreachBatch` ; préparation des features commune au batch et au streaming, colonne `probability` et taux prédit ; triggers `availableNow` et `processingTime`, watermark sur un horodatage converti ; lecture d'un plan Catalyst avec `explain("formatted")`, `PushedFilters` et `ReadSchema` ; Tungsten, whole-stage codegen et lecture vectorisée Parquet ; AQE, plan final, coalescence des partitions de shuffle et jointures adaptatives ; choix entre Lambda, Kappa et architecture hybride selon le besoin.

Une seule bonne réponse par question. Toutes les valeurs citées sont celles des TP de la formation. Le corrigé détaillé s’affiche après la correction. Ce quiz prépare le QCM de validation des acquis du dernier jour.

Question 1

Au TP 11, tu recharges le modèle de pourboire du TP 7 avec PipelineModel.load("out/modele_pourboire"). Quelle instruction applique ce modèle sur le flux de courses ?

Question 2

Tu lances requete(csv).explain("formatted") avec requete = lambda df: df.filter("trip_distance > 10").groupBy("PULocationID").agg(F.avg("total_amount")). Quelle ligne du plan montre que le filtre trip_distance > 10 est envoyé directement à la source de données ?

Question 3

Dans un plan physique, certains opérateurs sont préfixés par *(1), *(2), etc. Que signifie ce préfixe ?

Question 4

Après r.collect(), le plan affiché par r.explain() contient AQEShuffleRead coalesced. Qu'a fait AQE ?

Question 5

Lors de l'atelier, un client demande un tableau de bord rafraîchi toutes les 5 secondes et des alertes en cas d'anomalie. Quelle architecture correspond à la correction proposée ?

Question 6

Tu compares explain("formatted") en CSV puis en Parquet. Dans les deux cas, PushedFilters contient le filtre et ReadSchema ne garde que 3 colonnes. Qu'en conclus-tu ?

Question 7

Au TP 11, la même requête prend environ 0,42 s en CSV et 0,14 s en Parquet, soit trois fois moins. Quelle explication est juste ?

Question 8

Tu lances la requête de suivi : watermark de 10 minutes, fenêtres de 30 minutes, outputMode("append") et foreachBatch(traiter). Le premier micro-batch n'écrit aucune fenêtre. Quel est le diagnostic ?

def traiter(batch_df, batch_id):
    batch_df.write.mode("append").parquet("out/tp11/suivi")
    n = batch_df.count()
    if n:
        print(f"micro-batch {batch_id} : {n} fenêtres closes écrites")
Question 9

Tu exécutes r = requete(pq) puis r.collect(). Ensuite, tu lances requete(pq).explain() et tu lis isFinalPlan=false. Pourquoi ?

Question 10

Le même client ajoute un besoin : une facturation mensuelle exacte, à la course près. Le tableau de bord et les alertes passent déjà par le flux. Quelle approche retiens-tu ?

Question 11

Au TP 11, toute la préparation des features (filtre carte bancaire, heure, jointure avec zones, manhattan, nuit, label) tient dans une seule fonction features(df). Elle sert à l'entraînement quand le modèle manque, et sur le flux. Pourquoi ce choix ?

Question 12

Dans foreachBatch(traiter), la fonction traiter(batch_df, batch_id) écrit batch_df en Parquet puis appelle batch_df.count(). Qu'est-ce que batch_df ?

Question 13

Tu as lancé python scripts/stream_simulator.py courses --all --reset, puis le corrigé sans définir la variable MODE. Que fait la requête ?

flux = spark.readStream.schema(schema).option("maxFilesPerTrigger", 3).json("stream/courses")
...
q = (q.trigger(processingTime="5 seconds") if MODE == "live" else q.trigger(availableNow=True)).start()
q.awaitTermination(120 if MODE == "live" else None)
Question 14

Un participant écrit predictions.withWatermark("tpep_pickup_datetime", "10 minutes") et obtient une erreur au lancement. Quel est le diagnostic ?

Question 15

Au TP 7, un participant a sauvegardé le LinearSVC dans out/modele_pourboire. Au TP 11, le chargement réussit, mais la ligne vector_to_array("probability")[1] échoue. Que fais-tu ?

Question 16

Le corrigé compte les blocs whole-stage codegen du plan final ainsi :

plan_final = r._jdf.queryExecution().executedPlan().toString()
len(set(re.findall(r"\*\((\d+)\)", plan_final)))

Pourquoi passer par set ?

Question 17

Avant l'exécution, Catalyst choisit une stratégie de jointure à partir d'estimations de taille. Qu'apporte AQE sur une jointure ?

Question 18

Dans la requête de suivi, taux_predit est calculé avec F.avg("p_pourboire") et non avec F.avg("prediction"). Pourquoi ?

Question 19

Lors du partage, tu constates que taux_predit et taux_reel font des sauts d'une fenêtre à l'autre pour un arrondissement qui compte peu de courses. Quelle approche retiens-tu pour réduire ce bruit ?

Question 20

Pour le tableau de bord à 5 secondes et les alertes, un collègue propose Lambda : une couche batch et une couche temps réel en parallèle. Quel argument justifie de préférer Kappa pour ce besoin ?

Cliquez sur une carte pour la retourner. Mélangez-les pour une révision active.

1 / 20

Dépôt des participants : formations2026/formation-spark-ml (branche participants)

Contenu pédagogique © Ambient IT · 140 Avenue Jean Lolive, 93500 Pantin · formation@ambient-it.net · +33 (0)1 48 10 09 46

Organisme de formation enregistré sous le numéro 11 75 54743 75. Cet enregistrement ne vaut pas agrément de l'État.