Corrigé
Big Data Analytics Exam - Winter 2020
Ce document propose un corrigé complet et détaillé de l'examen de Big Data Analytics 2020. Il couvre l'architecture Hadoop2, ElasticSearch, Flume, Sqoop, la programmation PySpark sur les RDD ainsi qu'un QCM sur Spark et le Machine Learning.
D'après le document Big Data Analytics Exam - Winter 2020
Cet article a été rédigé automatiquement à partir du document source, puis vérifié avant publication.

Document source
Big Data and Data Processing · PDF · 3 pages · 2020
Afficher l'aperçu du document
Ce document présente un examen de Big Data Analytics, visant à évaluer les connaissances des étudiants sur les architectures Big Data, les outils comme Hadoop, ElasticSearch, Flume, Sqoop, ainsi que la programmation Spark et les concepts fondamentaux du machine learning. Les questions testent à la fois la compréhension théorique et la capacité à appliquer des commandes et concepts pratiques.
Exercice 1 : Architecture Big Data et Outils d'Ingestion
Cette première série de questions porte sur les architectures Big Data et les outils associés. Il s'agit de décrire, expliquer et comparer des composants et commandes utilisés dans un environnement Big Data.
1. Architecture de Hadoop2 et rôle de chaque composant
L’architecture Hadoop2 repose sur YARN (Yet Another Resource Negotiator) et suit un modèle maître-esclave. Elle comprend principalement :
- ResourceManager (RM) : composant maître qui gère les ressources du cluster et planifie les tâches.
- NodeManager (NM) : agent présent sur chaque nœud de travail qui gère l’exécution des conteneurs et surveille les ressources locales.
- ApplicationMaster (AM) : composant qui gère l’exécution d’une application spécifique, négocie les ressources auprès du ResourceManager et suit l’état des tâches.
- HDFS (Hadoop Distributed File System) : système de fichiers distribué qui stocke les données sur plusieurs nœuds.
- NameNode : serveur maître de HDFS qui gère les métadonnées du système de fichiers.
- DataNode : nœud esclave qui stocke les blocs de données réels et répond aux requêtes de lecture/écriture.
Réponse : Hadoop2 dissocie la gestion des ressources (YARN avec ResourceManager, NodeManager et ApplicationMaster) du stockage distribué (HDFS avec NameNode et DataNodes).
2. Architecture d'un cluster ElasticSearch
Un cluster ElasticSearch est constitué de plusieurs nœuds interconnectés :
- Master Node : gère la coordination du cluster, la création/suppression d'index et l'allocation des shards.
- Data Nodes : stockent les données, exécutent les opérations de recherche et d'indexation.
- Client / Coordinating Nodes : routent les requêtes des utilisateurs vers les bons nœuds de données.
- Shards (Primaire et Répliques) : découpage logique des index distribué sur l'ensemble des nœuds pour assurer la montée en charge et la haute disponibilité.
Réponse : Un cluster ElasticSearch se compose d'un ensemble de nœuds (Master, Data, Client) sur lesquels les index sont distribués sous forme de shards primaires et de répliques.
3. Intérêt des Index Patterns dans Kibana
Les Index Patterns dans Kibana sont indispensables pour l'exploration de données :
- Ils établissent un lien logique entre Kibana et un ou plusieurs index ElasticSearch (par exemple,
logstash-*). - Ils permettent à Kibana d'analyser le schéma des champs pour construire des visualisations et des tableaux de bord.
- Ils facilitent la recherche agrégée sur des séries temporelles distribuées.
Réponse : Un Index Pattern permet à Kibana d'identifier et de regrouper les index ElasticSearch à interroger pour l'analyse et la visualisation de données.
4. Composants d'un agent Flume
Un agent Flume est un processus JVM assurant la collecte et le transfert de données d'événement :
- Source : reçoit ou consomme des données depuis des générateurs externes. Exemples : Exec Source (exécute une commande comme
tail -F), NetCat Source, Spooling Directory Source, Syslog Source. - Channel : mémoire tampon intermédiaire conservant l'événement jusqu'à sa prise en charge par un sink. Exemples : Memory Channel (rapide, volatile), File Channel (durable, persiste sur disque).
- Sink : extrait l'événement du channel et le transmet vers sa destination finale. Exemples : HDFS Sink, ElasticSearch Sink, Logger Sink.
Réponse : L'agent Flume repose sur le triplet Source (ex : Syslog Source), Channel (ex : Memory Channel) et Sink (ex : HDFS Sink) pour assurer l'ingestion continue de données.
5. Signification de l'extension .tmp lors de l'importation Flume
Lors du transfert vers un système comme HDFS, Flume écrit les données dans des fichiers temporaires portant l'extension .tmp. Cette extension indique que le fichier est en cours d'écriture (actif). Dès que le fichier atteint la taille limite, le nombre d'événements requis ou le temps d'inactivité spécifié, Flume ferme le fichier et retire l'extension .tmp.
Réponse : L'extension .tmp désigne un fichier temporaire en cours d'écriture. Elle évite que des outils tiers (comme Hive ou Spark) ne lisent des données incomplètes avant la clôture du transfert.
6. Comparaison de deux commandes Sqoop Import
Considérons les deux instructions Sqoop suivantes :
sqoop import-all-tables --connect jdbc:mysql://localhost:3306/regions --username=root --warehouse-dir=/user/hive/warehouse/regions.db --m=1
sqoop import-all-tables -m 1 \
--connect jdbc:mysql://localhost:3306/regions \
--username=root \
--compression-codec=snappy \
--as-avrodatafile \
--warehouse-dir=/user/hive/warehouse
Analyse des différences clés :
- Format de stockage : La première commande importe les données au format texte délimité par défaut, alors que la seconde utilise
--as-avrodatafilepour stocker les données sous forme de fichiers binaires Avro (incluant le schéma d'origine). - Compression : La première commande ne compresse pas les données. La seconde applique la compression Snappy (
--compression-codec=snappy), réduisant l'occupation disque tout en offrant d'excellentes performances de décompression. - Répertoire cible : La première pointe directement vers le sous-dossier de base
regions.db, tandis que la seconde pointe vers le répertoire générique de l'entrepôt Hive/user/hive/warehouse.
Réponse : La seconde commande améliore la première en stockant les données au format binaire structuré Avro avec une compression Snappy, optimisant ainsi l'espace disque et la compatibilité.
7. Vérification de l'importation dans Hive
Pour vérifier que les tables et leurs données ont été correctement intégrées dans l'entrepôt Hive, on exécute la séquence de requêtes SQL/HiveQL suivante :
SHOW DATABASES;
USE regions;
SHOW TABLES;
SELECT * FROM nom_table LIMIT 10;
Réponse : Ces requêtes permettent de valider l'existence de la base de données, la présence de toutes les tables importées et la conformité des enregistrements insérés.
Exercice 2 : Manipulation des RDD avec PySpark
Ce second exercice traite de l'utilisation de PySpark pour manipuler des RDD (Resilient Distributed Datasets). On dispose du script d'initialisation suivant :
from pyspark import SparkContext
sc = SparkContext.getOrCreate()
rdd1 = sc.parallelize(["Satuday", "Sunday", "Monday", "Tuesday"])
rdd2 = sc.parallelize(["Wednesday", "Thursday", "Friday", "Satuday"])
1. Afficher les deux premiers éléments du rdd1
Commandes PySpark :
rdd1.take(2)
Réponse : La méthode take(2) extrait et renvoie sous forme de liste Python les deux premiers éléments du RDD (['Satuday', 'Sunday']).
2. Afficher le nombre d'éléments du rdd1
Commandes PySpark :
rdd1.count()
Réponse : La méthode count() renvoie le nombre total d'éléments contenus dans le RDD (résultat : 4).
3. Afficher le nombre de partitions du rdd2
Commandes PySpark :
rdd2.getNumPartitions()
Réponse : La méthode getNumPartitions() indique dans combien de partitions le RDD est distribué au sein du cluster.
4. Afficher tous les éléments du rdd2
Commandes PySpark :
rdd2.collect()
Réponse : L'action collect() rapatrie tous les éléments du RDD distribué vers le programme driver sous forme de liste.
5. Afficher les éléments résultant de l'union de rdd1 et rdd2
Commandes PySpark :
rdd1.union(rdd2).collect()
Réponse : La transformation union() combine les deux RDDs en conservant tous les éléments (y compris les doublons), et collect() affiche le résultat final.
Exercice 3 : QCM Big Data et Machine Learning
Correction argumentée du questionnaire à choix multiples :
-
Que signifie l'action dans Spark RDD ?
Réponse correcte : a. Le moyen d'envoyer le résultat des exécuteurs vers le driver
Explication : Contrairement aux transformations qui produisent de nouveaux RDDs, une action évalue le graphe de calcul DAG et retourne une valeur au programme driver. -
Les lacunes de Hadoop MapReduce ont été surmontées par Spark RDD à travers :
Réponse correcte : d. Tout ce qui précède
Explication : Spark surpasse MapReduce grâce à l'évaluation paresseuse (lazy evaluation), à l'optimisation par graphe orienté acyclique (DAG) et au traitement en mémoire vive (in-memory processing). -
Lequel des éléments suivants est le point d'entrée de l'application Spark ?
Réponse correcte : b. SparkContext
Explication : Dans le contexte d'utilisation directe des RDDs (comme présenté dans l'Exercice 2),SparkContextconstitue le point d'entrée fondamental. -
Apache Spark supporte :
Réponse correcte : d. Tout ce qui précède
Explication : Spark propose un écosystème complet couvrant le traitement par lots (Batch), en continu (Spark Streaming), ainsi que l'analyse de graphes (GraphX). -
Lequel des énoncés suivants est vrai pour un RDD ?
Réponse correcte : b. RDD dans Apache Spark est une collection immuable d'objets
Explication : Un RDD (Resilient Distributed Dataset) est par définition une collection d'objets distribuée, tolérante aux pannes et totalement immuable. -
Lequel des énoncés suivants n'est pas une transformation ?
Réponse correcte : c. Reduce
Explication :map,flatMapetfiltersont des transformations paresseuses, tandis quereduceest une action qui agrège les données et renvoie un résultat. -
Lors de la création d’un nouveau RDD :
Réponse correcte : b. Les données seront chargées lorsque la structure est évaluée
Explication : Du fait du principe de lazy evaluation, la création d'un RDD enregistre uniquement la lignée des opérations. Le chargement effectif ne se produit qu'au déclenchement d'une action. -
Quelle est la différence entre un RDD et un dataframe ?
Réponse correcte : b. En plus des données, les dataframes sont accompagnés d’un schéma.
Explication : Un DataFrame est une collection distribuée organisée en colonnes nommées, combinant la puissance des RDD avec la structure d'un schéma explicite. -
Quelle est la différence entre Apprentissage supervisé et non supervisé ?
Réponse correcte : a. En apprentissage supervisé les données sont étiquetées cependant en apprentissage non supervisé, les données ne sont pas étiquetées.
Explication : L'apprentissage supervisé apprend à prédire une étiquette cible connue, alors que le non-supervisé cherche des structures sous-jacentes dans des données non étiquetées. -
En apprentissage supervisé, quelle est la différence entre les familles Classification et Régression ?
Réponse correcte : a. En Classification, la cible est discrète. En régression, la cible est continue.
Explication : La classification prédit des catégories ou classes discrètes, tandis que la régression prédit une valeur numérique continue.
Méthode
Pour réussir cet examen de Big Data Analytics, il convient de suivre une méthode rigoureuse d'analyse des architectures et des syntaxes :
- Master des composants d'architecture : Identifiez clairement la répartition des rôles entre nœuds maîtres (NameNode, ResourceManager, Master Node) et nœuds esclaves (DataNode, NodeManager).
- Compréhension des flux d'ingestion : Pour Flume et Sqoop, analysez l'impact des options de configuration sur les formats de fichiers (Avro, Texte) et la performance (compression Snappy, parallélisme
-m 1). - Distinction Transformation vs Action dans Spark : Mémorisez que les transformations (
map,filter,union) construisent le graphe DAG sans exécuter de calcul, tandis que les actions (take,count,collect,reduce) déclenchent l'exécution effective des tâches sur le cluster. - Vérification systématique du code : Vérifiez scrupuleusement la casse des méthodes PySpark (ex :
getNumPartitions()etcollect()) ainsi que les paramètres transmis.