You are on page 1of 13
Spark a Programmer Avec Apache Spark Spark B Un moteur général rapide de traitement des données a large échelle C’est quoi Spark ? Spark ll est rapide + llexécute les progammes 100 fois plus rapide que Hadoop MapReduce en memoire ou 1U ols plus rapide sur disque * Moteur DAG (Dirested Acyclic Graph) optimise les flux de travail Spark a + Spark est écrit en Scala et s'exécute sur la machine virtuelle Java (JVM), N’est pas difficile * Les programmes Spark peuvent étre écrits en Scala * Construit autour d'un concept principal, les ensemble de données réparties résilientes (Resilient Distributed Data Sets -RDD) Spaik® Hadoop Map reduce versus Spark + Hadoop Map Reduce + Résultat écrit sur le disque *+ Opérations map reduce se font sur les disques. * Spark + Résultat écrit en RAM => oo" = ‘Tau de transfert beacon pls eapide du RAM vers le prooesseur que celui une autre ressouree a Spaik® Hadoop Map reduce versus Spark permet dexécuter des tequétes de type SOL Spak SQL punmel dextaive, transformer et charger des données sous aitferents formats (ISON, Parquet, base de données) ot les exposer pour des requétes a-hoe. Utlisé pour traitement temps-réel des ‘données en flux. I s'appule sur un mode de traitement en ‘micro batch" Une librarie de machine learning qui cenient tous 9 les algorthmes et utiitaires dapprentssage classiques, comme la classification, larégression, le Eo nx Graph importante Galgorthmes et de builders pour simpler les laches danalyse de grapes. sparksat [f spark streaming ff Machine Learning | Graph Anat 0) i inclit une callection Architecture systéme Wl Spark est un framework qui coordonne l'exécution de féches sur des données en les répartissant au sein d'un cluster de machines. Le programmeur envoie au framework des Spark Applications, pour lesquelles Spark affecte des ressources (RAM, CPU) du cluster en vue de leur exécution la gestion méme du cluster de machines peut étre déléguée soit au cluster manager de Spark, soit a Yarn ou & Mesos (d'autres gestionnaires pour Hadoop), al ‘Achtecture du syste Spark (psd bébedaFlspark batch hn) Architecture systeme + Une application Spark se compose d'un processus driver et d'exécuteurs (executors). Le driver est essentiel pour application car il exécute la fonction main() (le programme principal du driver) et est responsable de 3 choses > conserver les informations relatives & l'application > répondre aux saisies utlisateur ou aux demandes de 2rogrammes extemes © analyser, distribuer et ordonnancer les taches. Architecture syste me — omen 5 to [est z ‘Acer du ystime Spark (p:/o9e biped flspar-batch hr) + Un executor n'est responsable que de 2 choses : exécuter le code qui lui est assigné par le driver et lui rapporter état d’avancement de la t&che. + Le driver est accessible par un point dientrée appelé SparkSession, que l'on trouve derriére une variable spark. Architecture applicative a LLécosystéme des AP! de Spark comporte essentiellemant 3 niveaux © les APIs bas-niveau, avec les RDDs (Resilent Distributed Dataset): © les APIs de haut niveat, avec les Datasets, DataFrames et SOL; oles autres biblothaques (Structured Streaming, Advanced énalstics, etc). Programmer pyspark sous google collab A + Ouwtir volte boite email google, puis ouvrir drive, puis google collab Taper les commandes suivantes: ‘pip instal -q findspark ‘pip inetall pyepark from pyspark.sql import SzarkSession spark = SparkSession.builder.master(‘locall']’).getOrCreateQ) spark=SparkSession. build2r.appName(‘so!’).getOrCreate() ‘sc=spark.sparkContext Programmer pyspark sous google collab Cliquer sur sommaire puis le schéma du dossier (comme montre la fléche) pour copier dessous vous fichiers de donnée a bo # a : RDD (Resilient Distributed Data Set) Ei C'est une collection construite a partir d'une source de données (eg., un flux, un autre RDD). Calculé par une transformation, qui sélectionne, enrichit, restructure une collection, ou combine deux collections. = C’est du code fourrit par Spark. Apparent a la plateforme de Spark dans les chacun des langages suivants: 3°” ace * Spark historie les opérations qui ont permis de constituer un RDD. Cet historique sert a reconstituer le RDD en cas de panne. RDD (Resilient Distributed Data Set) * Les RDDs représentent des collections partitionnées et distribuées. Une RODD peut étre divisée en partitions logiques multiples qui peuvent étre stockées et traitées dans des machines différentes dans un cluster. = Un RDD constitue un "bloc" non modifiable. Si nécessaire il est entidrement recrée et recalculé avec des operations coarse-grain. + Un RDD peut étre marquée comme persistante : cans co cas en mémoire RAM et conserve par Spark. RDD (Resilient Distributed Data Set) Les colecions tment on E—-Q-“i cgraphe construt par application de transformations partir de collections stockees 20 pr rs Son * Créée par un programme pilote du programmeur * Spark est responsable de rendre la RDD résiliente et distribuée * Spark shell crée un objet dans Spark Context « sc » pour oréer la RDD Création d’une RDD = Spark Context « sc » permet de créer les RDD: ¥ A partir d'une source de données (un fichier, une iste, ....) ~ En parallélisant une collection (liste...) ¥ En appliquant une méthode de transformation Création d’une RDD A " Création dune RDD a partir d'un fichier: sc.textFile("ichemin du fichier/fichier.ext") ¥ En local, sous linux: rd1=sc.textFile(*/user/myfilesifile ext") ¥ En local, sous Windows:rd2=sc.textFile("d:/dossier/fle ext") ¥ Sous Hadoop: rd3=sc.textFile("hdfs://user/myfiles/file.ext") = Création d'une RDD en utilisant parallelize Création d’une RDD A Creer une RDO mums mee Exemple: toto,txt dens le contexte > nums = sc.parallelize ([1,2,3,41) aamaae > sc.textFile("d:/bigData/toto-o-text.txt") Le fichier peut ete dane un disque local ou dans un ‘luster HOFS2! ou SSni// Les collections parallélisées sont crées avec le méthode parallelize dans le contexte de Spark (sc) Création d’une RDD Peuvent étre créées a partir de: + JDBC (Java DataBase Connectivity) + Cassandra + Hoase + Elastisearch + JSON, csv, sequence files, object files, variété de formats comprimés Base de programmation d’une RDD A Transformations DAG tmnterence 9 Directed Acyclic Graph Base de programmation d’une RDD Actions Transformation d'une RDD renwtenasaece TT mapitune) ‘applique une fonction a chacune des données permet élminercetaines données, exeme rdfiterlambda x: x % 2 eertune) Pomel Stininer we nanines pete similaie & map, mais chaque élément fentée peu tre mappé & 0 ou fatMapttune) plusieus élements de sorte (done, func deat retourner une Seq pluot ‘ulun seul élément) distinct) supprime les doublons transfome des cs-valours (KV) en (KWW)oU W est un objetitrable. Par ‘sroupstyKey() DS 5 ‘exempb, (K,U) et (KV) seront transformées en (K, [ULV] Transformation d’une RDD Transformations Réle reduveByKey((une) sortByKey join(rdd) applique une fonction de réduction aux valeurs de chaque clé. Comme on a pu le voir, la fonction de réduction est appelée avec deux arguments. II est attendu que la fonction de Teducton soit commutative et associative, cest-a-dire que func(a.b) = func(b.a) et func(func(a.b).c) = functa, func(b.c)). Par exemple, la fonction func peut renvoyer le maximum entre deux valeur utilisée pour trier le résultat par clé permet de réaliser une jointure, ce qui a le méme sens que dans les bases de données relationrelles. Transformations) Réle aT Crée un nouveau ROD constitué dun échantillon de données sample(withReplace du RDD source, Sample a fraction fraction of the da, with oF ment, fraction, seed) without replacement, using a given random number generator, Transformation d'une RDD seed. Union() Union de deux ou plusieurs RDD Sort() Indu RDD. => Rien ne se passe pour le programme pilote (driver) jusqu’a une action est invoquée. Transformation d'une RDD Exemple: Idd=sc.parallelize({1,2,3,4)) terdd,map(lambda xxx) Crest quoi I'expression lambda? Plusieurs méthodes RCD acceptent lambda comme parametre, rdd.map(lambda x:x"x) Est equivalent a: ef auCarre(x) return x°x Fd. map(auCarre(x)) t= 4, numSlicee: Optionalfint]= None) Transformation d'une RDD ange (starts int, end: Optionelfint] = None, ctep: Crée un a RDD drentier situés entre start et end-1), chaque élément incrémenté ar step. numSlives indique le nombre de partitions de la nouvelle ROD. Siun seul argument est utlisé, argument est interprété somme end, and start est mis 80, Exemple sc.range(S).collect() Collec’) est utlisé pour pouvoir affcher le résultat de range (c'est une ‘action (0,1, 2,3,4] Transformation d'une RDD Exemple sc.range(2, 4).collect() 2,31 sc.range(|, 7, 2).collect() 3,5] agrége les éléments de l'ensemble de données en utilisant une fonction func (qui prend deux arguments et reduce(func) en renvoie un). La fonction deit étre commutative et associative afin qu'elle puisse étre calculée correctement en paralléle Les actions sur les RDD retourne un tableau avec les n premiers éléments du take(n) ADD Les actions sur les RDD A ‘Sum() Effectue une somme des éléments du RD. Permet dieffectuer des actions spécifiques pour chaque percochO) élément du ROD retourne toutes les données contenues dans le RDD collect() sous la forme d'une liste. Transfére les données du RDD dans le nceud principal (ou driver) du cluster Spark count() retourne le nombre de données contenues dans le ROD Les actions sur les RDD Si on exécute exemple: rdd=sc parallelize((1,2,34)) terdd.map(lambda x:x"x) Le résultat de transformationne sera pas affichee Sion ajoute ttake (4), on aura le résuttat: Ly a 9 aby Des Exemples d’opérations utilisant les RDD A Exemple 1: Le code suivant crée un itérateur de 10 000 éléments, puis utilise parallelize() pour distribuer ces données en 2 partitions from import ‘SparkContext() ma_liste = range(10000 dd = sc.parallelize(ma_liste, 2) nombres_impairs = rddfilter(iambda x: x % 2 != 0) Des Exemples d’opérations utilisant les RDD Exemple 2: Soit un fichier nommée data.trt exisiante dans Tunité d: et considérons ce programme en python: Une nouvelle ROD lineLengthe eat orée & Dart de lines qui contient ia lonqueur (len) Un fichier texte colo est trensformée en 42 chaque ligne ROD appelée ines dans le contede de Spark map est utllsée pour appliquer ta programnation fonctionnele utilisant lambda lines = sc textFile("d-data.tt") dui invoaue une fonction anonyme de paramere s et retoume lens. s sera lineLengths = lines. mapilambda &Ten(s)) _fempacée par les lignes de lines totalLength = lineLengths.reduce(lambda a, b: a +b) Des Exemples dopérations utilisant les ook lineLengths = lines. map(lambda s: len(s)) * Lafonction map prend en argument une fonction. Eile erée une nouveau ROD vide (collection vide), applique la fonction 2 chague élément de la collection clorigine et ins@re les valeurs de retour produites dans la nouvelle collection. Finalement, elle renvoie la nouvelle collection. = Dans exemple la nowvelle collection (nouveau RDD) est partir de la collection» lines sur laquelle map est invoquée orée a Des Exemples d’opérations utilisant les RDD A lineLengths = ines.map(lambda s: len(s)) Ce map ne prend pas une fonction nommée en parametre : i prend une fonction anonyme en définie A l'aide du mot-clef lambda. Les parameétres de cette fonction lambda sont définis a gauche du caractére deux-points et le corps de la fonction est défini a sa droite. Le résultat de I'exécution de cette fonction est renvoyé (implicitement). Des Exemples d’opérations utilisant les RDD 5 Reduce est une action. A ce point Spark divise lexécution en taches wir Vexécution sur des machines lineLengtns rest pas execute PO immédiatement & cause de la parse SéParée, Chaque machine exécute sa (lazy). part de map et une réduction locale et retoume son résultat au programme lines = se textFile("d:data. tet") pilote lineLengths = lines.mapitambda s: len(s)) totalLength = lineLengths.reduce(lambda a, b: a +b) Des Exemples d’opérations utilisant les RDD totalLength = lineLengths.reduce(lambda a, b: a +b) a est élément courant de Titération et b est accumulateur. C'est la valeur renvoyée par l'exécution de la fonction lambda sur [élément précédent. La fonction recuice() parcourt les éléments de Ia liste lineLengths et, pour chacun deux, exécute lambda sur les valeurs courantes de b et de a et renvoie le résultat ‘qui devient a de Fitération suivante. Des Exemples d’opérations utilisant les RDD totalLength = lineLengths.reduce(lambda a, b: a + b) Que vaut b lors de la premiére itération ? II n'y a pas de résultat d'une iteration précédente a lul passer. La fonction redlice() utlise la premiere valeur de la liste pour b et commence 4 itérer partir de la seconde valeur. Autrement dit, la premigre valeur de 2 est le second élément de la liste. Programmer avec Spark Créer un dossier sous c: ou d: appelé ExercicesSpark qui contiendra les datasets utilisées Exercice 1. Eorire un programme qui compte la somme obtenu pour chaque nomare de stars (de 1 a 5) utilises =" pour évaluer un film dans e fichier u.data Importer le fichier u.data sous le dossier de données ‘sous gooale collab import collections a lines = sc.textFile("/content/u.data") ratings = lines.map(\ambda x: x.split()[2}) = Retum the count of each unique value inthis result = ratings.countByValue() BD as a cctonary of value, cout) pas, sortedResults = collections, OrderedDict(soried(result.items())) ‘or key, value in sortedResults.items(): print("%s %i" % (key value)) we Le chemin du fichier est copié de google collab en cliquant avec le bouton droit sur le nom de fichier comme le montre le figure suivant Explications => Faire les importations des librairies nécessaires linport eollections = Sparkc ex) pour orger les rdd Importer la bibliothque collections qui sont des types de conteneurs de données comme les listes, les maps, ete. Charger les données co lines = sc.textFile(" /content/u.data”) + Aide texiFilo, le fichier sera lu ligne par ligne. Chaque ligne est un String + texfFile permet de retourner un enregistrement par ligne (map) les données voulues dans ce cas la valeur de colonne 2. a, (Compteurdecaonne debe de) z x ; \ js \. ratings = lines.map(lambda x: x.split()[2)) expression fait le split suivant espace et garde les données de la colonne 2 dans la variable ratings 47 \ 7 a ratings = lines.map(lambda x: x.split()[2]) > Lexpression fait le split suivant espace et extrait les données de la colonne 2 avec mep dans la variable ratings > map ne transforme pas la rdd source, elle crée une nouvelle: ratings qui est un vecteur =} Effectuer une action: compter par valeur i) result = ratings.countByValue() a2) @ an |=} Trier et afficher le résultat or sortedResults = collections OrderedDict(sorted(resuttitems()) for key, value in sortedResults items(): print("%s %i" % (Key, value)) > Utiliser la bibliothéque sur les collections en python OrderedDict (ordered dictionary) et la méthode eorted qui cera exécutée sur les items du ‘ichier result pour trier lee valeurs suivant la clé > %s alfichage sous format string, %l format integer Exécuter le programme Exercice 2. écrire un programme qui cherche le minimum de temperature pour une location, @ partir de la dase 1800.csv Temperatures seront convertit en fahrenheit en utilisant une fonction.

You might also like