Slide 1

Slide 1 text

Alexis Seigneurin @aseigneurin @ippontech 1 / 37

Slide 2

Slide 2 text

Spark Traitement large volumes de données Traitement distribué (commodity hardware) Ecrit en Scala, binding Java 2 / 37

Slide 3

Slide 3 text

Histoire 2009 : AMPLab de l'Université de Berkeley Juin 2013 : "Top-level project" de la fondation Apache Mai 2014 : version 1.0.0 Actuellement : version 1.1.0 3 / 37

Slide 4

Slide 4 text

Use cases Analyse de logs Traitement de fichiers texte Analytics Recherche distribuée (Google, avant) Détection de fraude Recommendation (articles, produits...) 4 / 37

Slide 5

Slide 5 text

Proximité avec Hadoop Mêmes use cases Même modèle de développement : MapReduce Intégration dans l'écosystème 5 / 37

Slide 6

Slide 6 text

Plus simple qu'Hadoop API plus simple à prendre en main Modèle MapReduce "relâché" Spark Shell : traitement interactif 6 / 37

Slide 7

Slide 7 text

Plus rapide qu'Hadoop Spark officially sets a new record in large-scale sorting (5 novembre 2014) Tri de 100 To de données Hadoop MR : 72 minutes avec 2100 noeuds (50400 cores) Spark : 23 minutes avec 206 noeuds (6592 cores) 7 / 37

Slide 8

Slide 8 text

Ecosystème Spark Spark Spark Shell Spark Streaming Spark SQL MLlib GraphX 8 / 37

Slide 9

Slide 9 text

Intégration Yarn, Zookeeper, Mesos HDFS Cassandra Elasticsearch MongoDB 9 / 37

Slide 10

Slide 10 text

Fonctionnement de Spark 10 / 37

Slide 11

Slide 11 text

RDD Resilient Distributed Dataset Abstraction, collection traitée en parallèle Tolérant à la panne Manipulation de tuples : Clé - Valeur Tuples indépendants les uns des autres 11 / 37

Slide 12

Slide 12 text

Sources : Fichier sur HDFS Fichier local Collection en mémoire S3 Base NoSQL ... Ou une implémentation custom de I n p u t F o r m a t 12 / 37

Slide 13

Slide 13 text

Transformations Manipule un RDD, retourne un autre RDD Lazy ! Exemples : map() : une valeur → une valeur mapToPair() : une valeur → un tuple filter() : filtre les valeurs/tuples groupByKey() : regroupe la valeurs par clés reduceByKey() : aggrège les valeurs par clés join(), cogroup()... : jointure entre deux RDD 13 / 37

Slide 14

Slide 14 text

Actions finales Ne retournent pas un RDD Exemples : count() : compte les valeurs/tuples saveAsHadoopFile() : sauve les résultats au format Hadoop foreach() : exécute une fonction sur chaque valeur/tuple collect() : récupère les valeurs dans une liste (List< T >) 14 / 37

Slide 15

Slide 15 text

Exemple 15 / 37

Slide 16

Slide 16 text

Word count Découpage des fichiers par fragments de 128 Mo (framework) Découpage des fragments par lignes (framework) Découpage des lignes en mots (map) Comptage des mots (reduce) Sur chaque noeud Puis sur un noeud pour le résultat final 16 / 37

Slide 17

Slide 17 text

Shakespeare, Hamlet, acte III, scène 1 17 / 37

Slide 18

Slide 18 text

Spark - Exemple s c . t e x t F i l e ( " s o m e / t e x t / f i l e s / * " ) . f l a t M a p ( l i n e - > A r r a y s . a s L i s t ( l i n e . s p l i t ( " \ \ W " ) ) ) . m a p T o P a i r ( w o r d - > n e w T u p l e 2 < S t r i n g , I n t e g e r > ( w o r d , 1 ) ) . r e d u c e B y K e y ( ( x , y ) - > x + y ) . c o l l e c t ( ) ; 18 / 37

Slide 19

Slide 19 text

Démo Spark Shell 19 / 37

Slide 20

Slide 20 text

Démo de Spark Shell $ s p a r k - s h e l l > v a r l i n e s = s c . t e x t F i l e ( " . . . / d a t a / a r b r e s a l i g n e m e n t p a r i s 2 0 1 0 . c s v " ) > l i n e s . c o u n t ( ) > v a r t r e e s = l i n e s . f i l t e r ( s = > ! s . s t a r t s W i t h ( " g e o m " ) ) > v a r t r e e s S p l i t = t r e e s . m a p ( l i n e = > l i n e . s p l i t ( " ; " ) ) > v a r h e i g h t s = t r e e s S p l i t . m a p ( f i e l d s = > f i e l d s ( 3 ) . t o F l o a t ) > h e i g h t s = h e i g h t s . f i l t e r ( h = > h > 0 ) > h e i g h t s . s u m ( ) / h e i g h t s . c o u n t ( ) 20 / 37

Slide 21

Slide 21 text

Spark en Cluster 21 / 37

Slide 22

Slide 22 text

Topologie Un master / des workers (+ un master en standby) Communication bidirectionnelle On soumet une application 22 / 37

Slide 23

Slide 23 text

Spark en Cluster Plusieurs options YARN Mesos Standalone Workers démarrés individuellement Workers démarrés par le master 23 / 37

Slide 24

Slide 24 text

Stockage & traitements MapReduce Spark (API) Traitement parallèle Tolérant à la panne Stockage HDFS, base NoSQL... Stockage distribué Tolérant à la panne 24 / 37

Slide 25

Slide 25 text

Colocation données & traitement Traiter la donnée là où elle se trouve Eviter les network I/Os 25 / 37

Slide 26

Slide 26 text

Colocation données & traitement 26 / 37

Slide 27

Slide 27 text

Démo Spark en Cluster 27 / 37

Slide 28

Slide 28 text

Démo $ $ S P A R K _ H O M E / s b i n / s t a r t - m a s t e r . s h $ $ S P A R K _ H O M E / b i n / s p a r k - c l a s s o r g . a p a c h e . s p a r k . d e p l o y . w o r k e r . W o r k e r s p a r k : / / M B P - d e - A l e x i s : 7 0 7 7 - - c o r e s 2 - - m e m o r y 2 G $ m v n c l e a n p a c k a g e $ $ S P A R K _ H O M E / b i n / s p a r k - s u b m i t - - m a s t e r s p a r k : / / M B P - d e - A l e x i s : 7 0 7 7 - - c l a s s c o m . s e i g n e u r i n . s p a r k . W i k i p e d i a M a p R e d u c e B y K e y - - d e p l o y - m o d e c l u s t e r t a r g e t / p r e s - s p a r k - 0 . 0 . 1 - S N A P S H O T . j a r 28 / 37

Slide 29

Slide 29 text

Spark Streaming 29 / 37

Slide 30

Slide 30 text

Micro-batches Découpe un flux continu en batches API identique ≠ Apache Storm 30 / 37

Slide 31

Slide 31 text

DStream Discretized Streams Séquence de RDDs Initialisé avec une D u r a t i o n 31 / 37

Slide 32

Slide 32 text

Window operations Fenêtre glissante Réutilise des données d'autres fenêtres Initialisé avec window length et slide interval 32 / 37

Slide 33

Slide 33 text

Sources Socket Kafka Flume HDFS MQ (ZeroMQ...) Twitter ... Ou une implémentation custom de R e c e i v e r 33 / 37

Slide 34

Slide 34 text

Démo Spark Streaming 34 / 37

Slide 35

Slide 35 text

Démo de Spark Streaming Consommation de Tweets #Android Twitter4J Détection de la langue du Tweet Language Detection Indexation dans ElasticSearch Analyse dans Kibana 4 35 / 37

Slide 36

Slide 36 text

Démo Lancer ElasticSearch $ c u r l - X D E L E T E l o c a l h o s t : 9 2 0 0 $ c u r l - X P U T l o c a l h o s t : 9 2 0 0 / s p a r k / _ m a p p i n g / t w e e t s ' { " t w e e t s " : { " p r o p e r t i e s " : { " u s e r " : { " t y p e " : " s t r i n g " , " i n d e x " : " n o t _ a n a l y z e d " } , " t e x t " : { " t y p e " : " s t r i n g " } , " c r e a t e d A t " : { " t y p e " : " d a t e " , " f o r m a t " : " d a t e _ t i m e " } , " l a n g u a g e " : { " t y p e " : " s t r i n g " , " i n d e x " : " n o t _ a n a l y z e d " } } } } ' Lancer Kibana http://localhost:5601 Lancer le traitement 36 / 37

Slide 37

Slide 37 text

@aseigneurin - @ippontech aseigneurin.github.io - blog.ippon.fr 37 / 37