Introduction à Apache Spark et Hadoop
Introduction à Apache Spark et Hadoop
➢On peut noter l'intérêt grandissant pour Spark en suivant son évolution
dans les termes de recherche sur Google Trends et dans les tags sur
StackOverflow.
L’émergence de Spark
➢MapReduce a grandement simplifié l'analyse Big Data sur des clusters de grande taille
composé de machines susceptibles de tomber en panne.
➢ Les utilisateurs demandent toujours des applications de plus en plus complexes, comme
les opérations itératives ( pour du Machine Learning par exemple) ou des opérations
interactives ( plusieurs requêtes sur un même échantillon des données).
➢ Pour les opérations itératives : le seul moyen par mapReduce est de créé un job pour
chaque itération et partager les données entre les jobs en écrivant physiquement les
données dans HDFS.
➢Les deux applications itératives et interactives nécessitent le partage de données plus
rapide entre les emplois parallèles.
Avec Spark, le traitement basé sur la mémoire partagée, les résultats intermédiaire sont
sauvegardés dans la mémoire centrale ce que rend Spark 100 fois rapide que Mapreduce.
Spark inclut plus de 80 opérateurs pour écrire rapidement des applications en Java, Scala, R
ou Python. Il est possible de l’utiliser de façon interactive pour requêter les données depuis
un Shell.
Architecture de Spark
• Une application Spark est une instance de la classe SparkContext, utilisé pour créer
des RDD : les codes et les objets nécessaires pour l'application Spark.
• Pour exécuter des jobs sur un cluster, SparkContext se connecte au gestionnaire de
ressources pour allouer des ressources du système pour l'application et planifier
l'exécution des tâches.
• Le Driver gère l'exécution et la création de SparkContext et l’écriture de logs.
• Le Executor permet d’exécuter les tâches sur les nœuds.
Les APIs de Spark
• Spark est écrit en Scala et s’exécute sur la machine virtuelle Java (JVM).
• Les langages supportés actuellement pour le développement d’applications sont :
Java, Python, Scala et R.
• À côté de l’API principale de Spark, l’écosystème contient les librairies : Spark SQL,
Spark Streaming, MLIB, GraphX qui permettent de travailler dans le domaine des
analyses Big Data.
Core Spark
Modes d'exécution
En mode cluster :
• Spark avec Mesos : Avec un gestionnaire de cluster général qui peut exécuter les
applications Spark et autres applications ( MapReduce...)
• Lancement de zeppelin :
Dans « etc/hadoop/core-site.xml » :
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
Dans « etc/hadoop/hdfs-site.xml » :
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value> </property>
</configuration>
Introduction à Hadoop
• Hadoop Common.
Introduction à Hadoop
HDFS :
MapReduce :
• Job tracker : gére les jobs, plainifie les tâches à exécuter.
App
App
MapRedu
HDFS
ce
Hadoop client
Hadoop Plateforme
1. Formater HDFS :
$ sbin/start-dfs.sh
$ sbin/stop-dfs.sh
Quelques Commendes HDFS
➢ Pour écrire des application Spark en Java il faut ajouter les dépendances Spark via
Maven.
Interagir avec Spark
• En mode local
conf = SparkConf().setAppName(appName).setMaster(master)
sc = SparkContext(conf=conf)
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.SparkConf;
➢Un RDD est une collection immuable : chaque opération créant un nouveau
RDD.
Resilient Distributed Datasets ( RDD )
➢Un RDD est une collection partitionnée des objets : plus de partitions plus de
parallélisme.
Resilient Distributed Datasets ( RDD )
➢Un RDD est tolérant à la panne : si une partition RDD échoue, elle sera créée sur
un autre nœud.
Resilient Distributed Datasets ( RDD )
Exemple de RDD :
Le fichier texte suivant va être transformé en RDD.
Fichier: descriptif.txt Le fichier est transformé en RDD par la function textFile.
Chaque ligne de ce fichier est un élément de l’RDD.
descriptif_RDD = sc.textFile("descriptif.txt")
RDD: descriptif_RDD
Exemple de RDD :
RDD: descriptif_RDD
descriptif_RDD.count()
Valeur = 4
Resilient Distributed Datasets ( RDD )
Exemple de RDD :
RDD: descriptif_RDD
nouveau RDD
Un autre RDD auquel on aura appliqué une transformation comme filter, map…
Création d’un RDD
❖ Exemples :
Action Signification
Agréger les éléments du RDD en utilisant la fonction func (qui prend 2 arguments et retourne
reduce(func)
1 résultat).
Retourner tous les items du RDD comme un tableau au programme driver. A utiliser
collect() seulement si le RDD a un volume faible (par ex., après des opérations de type filter très
sélectives).
Pour RDD de type (clé, valeur), retourne l’ensemble de paires (clé, Int) avec le nombre de
countByKey()
valeurs pour chaque clé.
Écrit les items du RDD dans un fichier texte dans un répertoire du système de fichiers local,
saveAsTextFile(path) HDFS ou autre fichier supporté par Hadoop. Spark appelle toString pour convertir chaque
item en une ligne de texte dans le fichier.
Les actions RDD
❖ Exemples :
Transformation Signification
Retourne un nouveau RDD obtenu en appliquant la fonction func à chaque item du RDD de
map(func)
départ.
Retourne un nouveau RDD obtenu en sélectionnant les items de la source pour lesquels la
filter(func)
fonction func retourne “vrai”.
Similaire à map mais chaque item du RDD source peut être transformé en 0 ou plusieurs
flatMap(func)
items ; retourne une séquence (Seq) plutôt qu’un seul item.
Retourne un RDD qui est l’union des items du RDD source et du RDD argument
union(otherDataset)
(otherDataset).
distinct() Retourne un RDD qui est obtenu du RDD source en éliminant les doublons des items.
somme
Les transformations RDD
System.out.println(somme);
Les transformations RDD
System.out.println(somme);
Spark SQL
Spark SQL, composant du framework Apache Spark, est utilisé pour effectuer des
traitements sur des données structurées en exécutant des requêtes de type SQL sur les
données Spark.
Spark SQL construit des Data Frame à partir des différents sources de données comme:
fichiers ORC ou JSON, RDD, Table Hive, etc.
Les Data Frame sont des RDDs représentées logiquement en lignes et colonnes en
mémoire (contrairement à Hive: sur disque).
Spark SQL
Les Data Frames peuvent être créées à partir de différentes sources de données :
● Spark SQL fournit SQLContext afin d’encapsuler les fonctions SQL dans Spark.
● SQL Context est créé à partir du SparkContext existant.
// Spark 1.6 :
from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
// Spark 2 :
spark = SparkSession.builder.appName("appName").getOrCreate();
// Spark 1.6 :
import org.apache.spark.sql.SQLContext;
JavaSparkContext sc = ...; // An existing JavaSparkContext.
SQLContext sqlContext = new org.apache.spark.sql.SQLContext(sc);
// Spark 2 :
SparkSession spark = SparkSession.builder().getOrCreate();
Spark SQL
Spark UI est une interface Web pour surveiller les exécutions des Jobs Spark
Console Web Spark – Spark UI
• Une Task Spark est une unité de traitement, exemple : map, filter
• Une Stage Spark regroupe un ensemble des Task qu’il est possible
d’exécuter ensemble.
Les User Defined Functions (UDF) permettent de créer une nouvelle colonne dans un
dataframe qui sera le résultat d'un calcul pouvant utiliser les valeurs d'une (ou
plusieurs) colonne(s) existante(s).
et retourne :
•Un RDD peut être marqué comme persistant pour le réutiliser dans d'autres chaînes, il
sera stocké en RAM et disponible comme source de données pour d'autres
transformations.
•S’il n’est pas marqué comme persistant, le RDD sera transitoire et ne sera pas conservé
en mémoire après calcul
df1.cache()
save
DF UDF DF1
LOAD
sum
T2
RDD Partitioning
• Une partition représente une partie de la donnée d’un RDD.
• Le nombre de partitions par défaut d’un RDD est égal au nombre de cores que
possède la machine.
• Chacune des partitions sera à la charge d’un executor lors des traitements.
Spark streaming
➔ Spark Streaming est composé d’un Receiver qui consomme les données en mode
micro-batch et les transforme en un RDD spécifique appelé DStream
(flux discrétisé).
➔ Les données reçues sont découpées en tranches DStream selon une durée
précisée.
Spark streaming
➔ Les DStreams et les Receivers sont tolérants à la panne : par défaut chaque
DStream est dupliqué sur deux exécuteurs différents : si un est échoue l’autre le
remplace.
Spark streaming
import org.apache.spark.SparkConf;
import org.apache.spark.streaming.Durations;
import org.apache.spark.streaming.api.java.JavaStreamingContext;
❖ textFileStream() : streaming des données à partir d’un répertoire du système de fichiers local ou
HDFS.
❖ socketTextStream() : streaming des données à partir de protocole TCP.
❖ saveAsTextFiles() Ecrit les items dans un fichier texte dans un répertoire du système de fichiers local ou
HDFS.
// Streaming from local/HDFS Directories
textStreamInput = psc.textFileStream("pathToDirectory")