21/01/2020 Spark 23
RDD : Principe
Spark est puissant car il repose sur des principes peu nombreux et
simples.
Données : RDD (Resilient Distributed Datasets)
Resilient : tolérance aux pannes grâce au DAG. Possibilité de recalcul des
données endommagées
Distributed : données réparties sur plusieurs nœuds worker d’un cluster.
21/01/2020 Spark 24
RDD : Principe
21/01/2020 Spark 25
RDD : Resilient Distributed Dataset
L’objet principal de Spark est le RDD : Resilient Distributed Dataset.
Un dispositif pour traiter une collection de données par des
algorithmes parallèles robustes.
Un RDD ne contient pas vraiment de données, mais seulement un
traitement. Ce traitement n’est effectué que lorsque cela apparaît
nécessaire. On appelle cela l’évaluation paresseuse.
Variables partagées entre des traitements et distribuées sur le cluster de
machines.
Spark fait en sorte que le traitement soit distribué sur le cluster, donc
calculé rapidement, et n’échoue pas même si des machines tombent en
panne.
21/01/2020 Spark 26
Caractéristique d’un RDD
RDD utilise des opérations mapreduce qui permettent de traiter et de
générer un large volume de données avec un algorithme parallèle et
distribuée.
On peut charger les données a partir de n’importe quelle source et la
convertir en RDD et les stocker en mémoire pour calculer les résultats.
RDD est composé d’un ensemble de partitions. Une partition est une
division logique de données qui est immuable et créée suite a des
transformations d’autre partition existante.
En cas de perte de partition RDD, on peut reprendre les
transformations sur le RDD d’origine au lieu de répliquer les données
sur plusieurs nœuds.
21/01/2020 Spark 27
RDD : Calcul
Transformations : Comme avec MapReduce, chaque ligne du fichier
constitue un enregistrement. Les transformations appliquées sur le
RDD traiteront chaque ligne séparément. Les lignes du fichier sont
distribuées sur différentes machines pour un traitement parallèle.
Elles créent un nouveau RDD à partir d’un existant.
Actions : ce sont des fonctions qui permettent d’extraire des
informations des RDD, par exemple les afficher sur l’écran ou les
enregistrer dans un fichier.
21/01/2020 Spark 28
Actions
Ce sont des méthodes qui s’appliquent à un RDD pour retourner une
valeur ou une collection.
[Link]() retourne le contenu du RDD
[Link]() retourne le nombre d’éléments
[Link]() retourne le premier élément
[Link](n) retourne les n premiers éléments.
[Link](fonction) Agréger les éléments du RDD en utilisant la fonction
définie (qui prend 2 arguments et retourne 1 résultat). La fonction devrait
être associative et commutative afin de pouvoir être correctement calculée
en parallèle.
[Link]((a, b) => a + b)
[Link]() ou [Link]() Sauvegarder le RDD en mémoire avant
l’execution (action)
21/01/2020 Spark 29
Actions
Un RDD peut être sauvegardé :
sous forme de fichier texte avec saveAsTextFile(path)
sous forme de SequenceFile Hadoop avec saveAsSequenceFile(path),
dans un format simple en utilisant la sérialisation Java avec
saveAsObjectFile(path).
21/01/2020 Spark 30
Transformations
Chacune de ces méthodes retourne un nouveau RDD à partir de celui
qui est concerné.
[Link](fonction) chaque appel à la fonction doit retourner une valeur qui
est mise dans le RDD sortant.
val longueursLignes = [Link](l => [Link])
[Link](fonction) chaque item du RDD source peut être transformé en
0 ou plusieurs items ; retourner une séquence plutôt qu’un seul item.
parallelize() partitionner le RDD automatiquement à partir des
caractéristiques du cluster sur lequel les calculs doivent être réalisés.
val RDD = [Link](Array(1,2,3,4))
[Link](fonction) la fonction retourne un booléen.
linesfilter = [Link](line => [Link]("Komal"))
21/01/2020 Spark 31
Transformations ensemblistes
Ces transformations regroupent deux RDD
[Link]() : retourne un seul exemplaire de chaque élément.
RDD = [Link](Array(1, 2, 3, 4, 6, 5, 4, 3))
[Link]().collect()
[Link](RDD2) : contrairement à son nom, ça retourne la
concaténation et non pas l’union des deux RDD.
Rajouter distinct() pour faire une vraie union.
RDD1 = [Link](Array(1,2,3,4))
RDD2 = [Link](Array(6,5,4,3))
[Link](RDD2).collect()
[Link](RDD2) : retourne l’intersection des deux RDD.
[Link](RDD2).collect()
21/01/2020 Spark 32
Transformations de type jointure
Spark permet de calculer des jointures entre RDD1={(K1,V1). . . } et
RDD2={(K2,V2). . . } et partageant des clés K identiques.
[Link](RDD2) : retourne toutes les paires (K, (V1, V2)) lorsque V1 et V2
ont la même clé.
RDD1 = [Link](Array((1,"tintin"),(2,"asterix"),(3,"spirou") ))
RDD2 = [Link](Array((1,1930),(2,1961),(1,1931),(4,1974) ))
print [Link](RDD2).collect()
21/01/2020 Spark 33