Alexis Seigneurin
@aseigneurin @ippontech
Spark
● Traitement de larges volumes de données
● Traitement distribué (commodity hardware)
● Ecrit en Scala, bindings Java et Python
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.3
Use cases
● Analyse de logs
● Traitement de fichiers texte
● Analytics
● Traitement données objets connectés
● Recherche distribuée (Google, avant)
● Détection de fraude
● Recommandation (articles, produits...)
Proximité avec Hadoop
● Mêmes use cases
● Même modèle de
développement :
MapReduce
● Intégration dans
l'écosystème
Plus simple qu’Hadoop
● API plus simple à prendre en main
● Modèle MapReduce "relâché"
● Spark Shell : traitement interactif
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)
Écosystème Spark
● Spark
● Spark Shell
● Spark Streaming
● Spark SQL
● Spark ML
● GraphX
Intégration
● Yarn, Zookeeper, Mesos
● HDFS
● Cassandra, Elasticsearch, MongoDB
● Zeppelin
Fonctionnement de Spark
● 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
RDD
Sources
● Fichier sur HDFS
● Fichier local
● Collection en mémoire
● Amazon S3
● Base NoSQL
● ...
● Ou une implémentation custom de
InputFormat
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 les valeurs par clés
○ reduceByKey() : aggrège les valeurs par clés
○ join(), cogroup()... : jointure entre deux RDD
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>)
Exemple
● Arbres de Paris : fichier CSV en Open Data
● Comptage d’arbres par espèce
Spark - Exemple
geom_x_y;circonfere;adresse;hauteurenm;espece;varieteouc;dateplanta
48.8648454814, 2.3094155344;140.0;COURS ALBERT 1ER;10.0;Aesculus hippocastanum;;
48.8782668139, 2.29806967519;100.0;PLACE DES TERNES;15.0;Tilia platyphyllos;;
48.889306184, 2.30400164126;38.0;BOULEVARD MALESHERBES;0.0;Platanus x hispanica;;
48.8599934405, 2.29504883623;65.0;QUAI BRANLY;10.0;Paulownia tomentosa;;1996-02-29
...
Spark - Exemple
JavaSparkContext sc = new JavaSparkContext("local", "arbres");
sc.textFile("data/arbresalignementparis2010.csv")
.filter(line -> !line.startsWith("geom"))
.map(line -> line.split(";"))
.mapToPair(fields -> new Tuple2<String, Integer>(fields[4], 1))
.reduceByKey((x, y) -> x + y)
.sortByKey()
.foreach(t -> System.out.println(t._1 + " : " + t._2));
[... ; … ; …]
[... ; … ; …]
[... ; … ; …]
[... ; … ; …]
[... ; … ; …]
[... ; … ; …]
u
m
k
m
a
a
textFile mapToPairmap
reduceByKey
foreach
1
1
1
1
1
u
m
k
1
2
1
2a
...
...
...
...
filter
...
...
sortByKey
a
m
2
1
2
1u
...
...
...
...
...
...
geom;...
1 k
Spark - Exemple
Acacia dealbata : 2
Acer acerifolius : 39
Acer buergerianum : 14
Acer campestre : 452
...
DataFrames et Spark SQL
● Spark 1.3
● Processing de données structurées
● DataFrames ~= RDD + colonnes nommées
● DSL :
○ select()
○ where()
○ groupBy()
○ ...
DataFrames
DataFrames
Préalable :
● Disposer de données tabulaires
● Décrire le schéma → DataFrame
Description de schéma :
● Description programmatique des données
● Inférence de schéma par réflexion (POJO)
JavaRDD<Row> rdd = trees.map(fields -> Row.create(
Float.parseFloat(fields[3]), fields[4]));
● Création de données tabulaires
○ Type Row
○ Type personnalisé
DataFrames - Exemple
---------------------------------------
| 10.0 | Aesculus hippocastanum |
| 15.0 | Tilia platyphyllos |
| 0.0 | Platanus x hispanica |
| 10.0 | Paulownia tomentosa |
| ... | ... |
JavaRDD<Row> rdd = trees.map(fields -> new Tree(
Float.parseFloat(fields[3]), fields[4]));
DataFrames - Inférence du schéma
DataFrame df = sqlContext.createDataFrame(trees, Tree.class);
adresse circonfere dateplanta espece geom_x_y hauteurenm
varieteouc
COURS ALBERT 1ER 140.0 Aesculus hippocas... 48.8648454814, 2.... 10.0
PLACE DES TERNES 100.0 Tilia platyphyllos 48.8782668139, 2.... 15.0
BOULEVARD MALESHE... 38.0 Platanus x hispanica 48.889306184, 2.3... 0.0
QUAI BRANLY 65.0 1996-02-29 Paulownia tomentosa 48.8599934405, 2.... 10.0
df.printSchema();
df.show();
root
|-- adresse: string (nullable = true)
|-- circonfere: string (nullable = true)
|-- dateplanta: string (nullable = true)
|-- espece: string (nullable = true)
|-- geom_x_y: string (nullable = true)
|-- hauteurenm: float (nullable = false)
|-- varieteouc: string (nullable = true)
● Comptage d’arbres par espèce
DataFrames - DSL
espece COUNT(1)
Acacia dealbata 2
Acer acerifolius 39
Acer buergerianum 14
Acer campestre 452
Acer cappadocicum 111
...
DataFrame df = sqlContext.createDataFrame(trees, Tree.class);
df
.select(df.col("espece"))
.where(df.col("espece").notEqual(""))
.groupBy(df.col("espece"))
.agg(Collections.singletonMap("*", "count"))
.sort("espece")
.show();
● Exploitation d’un DataFrame en SQL
● Moteur d’exécution SQL : convertit les
requêtes en instructions de base
Spark SQL
● Comptage d’arbres par espèce
Spark SQL - Requêtage
sqlContext.sql("SELECT espece, COUNT(*)
FROM tree
WHERE espece <> ''
GROUP BY espece
ORDER BY espece")
.show();
espece c1
Acacia dealbata 2
Acer acerifolius 39
Acer buergerianum 14
Acer campestre 452
Acer cappadocicum 111
...
Spark en cluster
Topologie & Terminologie
● Un master / des workers
○ (+ un master en standby)
● On soumet une application
● Exécution pilotée par un driver
Spark en cluster
Plusieurs options
● YARN
● Mesos
● Standalone
○ Workers démarrés individuellement
○ Workers démarrés par le master
MapReduce
● Spark (API)
● Traitement distribué
● Tolérant à la panne
Stockage
● HDFS, base NoSQL...
● Stockage distribué
● Tolérant à la panne
Stockage & traitements
Colocation données & traitement
● “Data locality”
● Traiter la donnée là où elle se trouve
● Eviter les network I/Os
Colocation données & traitement
Spark
Worker
HDFS
Datanode
Spark
Worker
HDFS
Datanode
Spark
Worker
HDFS
Datanode
Spark Master
HDFS
Namenode
HDFS
Namenode
(Standby)
Spark
Master
(Standby)
Démo
Spark en cluster
Démo
$ $SPARK_HOME/sbin/start-master.sh
$ $SPARK_HOME/bin/spark-class
org.apache.spark.deploy.worker.Worker
spark://MBP-de-Alexis:7077
--cores 2 --memory 2G
$ mvn clean package
$ $SPARK_HOME/bin/spark-submit
--master spark://MBP-de-Alexis:7077
--class com.seigneurin.spark.WikipediaMapReduceByKey
--deploy-mode cluster
target/pres-spark-0.0.1-SNAPSHOT.jar
Spark Streaming
Micro-batches
● Découpe un flux continu en batches
● API identique
● ≠ Apache Storm
DStream
● Discretized Streams
● Séquence de RDDs
● Initialisé avec une Duration
Window operations
● Fenêtre glissante
● Réutilise des données d'autres fenêtres
● Initialisé avec window length et slide interval
Sources
● Socket
● Kafka
● Flume
● HDFS
● MQ (ZeroMQ...)
● Twitter
● ...
● Ou une implémentation custom de Receiver
Démo
Spark Streaming
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
$ curl -X DELETE localhost:9200
$ curl -X PUT localhost:9200/spark/_mapping/tweets '{
"tweets": {
"properties": {
"user": {"type": "string","index": "not_analyzed"},
"text": {"type": "string"},
"createdAt": {"type": "date","format": "date_time"},
"language": {"type": "string","index": "not_analyzed"}
}
}
}'
● Lancer ElasticSearch
Démo
● Lancer Kibana -> http://localhost:5601
● Lancer le traitement
@aseigneurin
aseigneurin.github.io
@ippontech
blog.ippon.fr

Spark (v1.3) - Présentation (Français)

  • 1.
  • 2.
    Spark ● Traitement delarges volumes de données ● Traitement distribué (commodity hardware) ● Ecrit en Scala, bindings Java et Python
  • 3.
    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.3
  • 4.
    Use cases ● Analysede logs ● Traitement de fichiers texte ● Analytics ● Traitement données objets connectés ● Recherche distribuée (Google, avant) ● Détection de fraude ● Recommandation (articles, produits...)
  • 5.
    Proximité avec Hadoop ●Mêmes use cases ● Même modèle de développement : MapReduce ● Intégration dans l'écosystème
  • 6.
    Plus simple qu’Hadoop ●API plus simple à prendre en main ● Modèle MapReduce "relâché" ● Spark Shell : traitement interactif
  • 7.
    Plus rapide qu’Hadoop Sparkofficially 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)
  • 8.
    Écosystème Spark ● Spark ●Spark Shell ● Spark Streaming ● Spark SQL ● Spark ML ● GraphX
  • 9.
    Intégration ● Yarn, Zookeeper,Mesos ● HDFS ● Cassandra, Elasticsearch, MongoDB ● Zeppelin
  • 10.
  • 11.
    ● Resilient DistributedDataset ● Abstraction, collection traitée en parallèle ● Tolérant à la panne ● Manipulation de tuples : ○ Clé - Valeur ○ Tuples indépendants les uns des autres RDD
  • 12.
    Sources ● Fichier surHDFS ● Fichier local ● Collection en mémoire ● Amazon S3 ● Base NoSQL ● ... ● Ou une implémentation custom de InputFormat
  • 13.
    Transformations ● Manipule unRDD, retourne un autre RDD ● Lazy ! ● Exemples : ○ map() : une valeur → une valeur ○ mapToPair() : une valeur → un tuple ○ filter() : filtre les valeurs/tuples ○ groupByKey() : regroupe les valeurs par clés ○ reduceByKey() : aggrège les valeurs par clés ○ join(), cogroup()... : jointure entre deux RDD
  • 14.
    Actions finales ● Neretournent 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>)
  • 15.
  • 16.
    ● Arbres deParis : fichier CSV en Open Data ● Comptage d’arbres par espèce Spark - Exemple geom_x_y;circonfere;adresse;hauteurenm;espece;varieteouc;dateplanta 48.8648454814, 2.3094155344;140.0;COURS ALBERT 1ER;10.0;Aesculus hippocastanum;; 48.8782668139, 2.29806967519;100.0;PLACE DES TERNES;15.0;Tilia platyphyllos;; 48.889306184, 2.30400164126;38.0;BOULEVARD MALESHERBES;0.0;Platanus x hispanica;; 48.8599934405, 2.29504883623;65.0;QUAI BRANLY;10.0;Paulownia tomentosa;;1996-02-29 ...
  • 17.
    Spark - Exemple JavaSparkContextsc = new JavaSparkContext("local", "arbres"); sc.textFile("data/arbresalignementparis2010.csv") .filter(line -> !line.startsWith("geom")) .map(line -> line.split(";")) .mapToPair(fields -> new Tuple2<String, Integer>(fields[4], 1)) .reduceByKey((x, y) -> x + y) .sortByKey() .foreach(t -> System.out.println(t._1 + " : " + t._2)); [... ; … ; …] [... ; … ; …] [... ; … ; …] [... ; … ; …] [... ; … ; …] [... ; … ; …] u m k m a a textFile mapToPairmap reduceByKey foreach 1 1 1 1 1 u m k 1 2 1 2a ... ... ... ... filter ... ... sortByKey a m 2 1 2 1u ... ... ... ... ... ... geom;... 1 k
  • 18.
    Spark - Exemple Acaciadealbata : 2 Acer acerifolius : 39 Acer buergerianum : 14 Acer campestre : 452 ...
  • 19.
  • 20.
    ● Spark 1.3 ●Processing de données structurées ● DataFrames ~= RDD + colonnes nommées ● DSL : ○ select() ○ where() ○ groupBy() ○ ... DataFrames
  • 21.
    DataFrames Préalable : ● Disposerde données tabulaires ● Décrire le schéma → DataFrame Description de schéma : ● Description programmatique des données ● Inférence de schéma par réflexion (POJO)
  • 22.
    JavaRDD<Row> rdd =trees.map(fields -> Row.create( Float.parseFloat(fields[3]), fields[4])); ● Création de données tabulaires ○ Type Row ○ Type personnalisé DataFrames - Exemple --------------------------------------- | 10.0 | Aesculus hippocastanum | | 15.0 | Tilia platyphyllos | | 0.0 | Platanus x hispanica | | 10.0 | Paulownia tomentosa | | ... | ... | JavaRDD<Row> rdd = trees.map(fields -> new Tree( Float.parseFloat(fields[3]), fields[4]));
  • 23.
    DataFrames - Inférencedu schéma DataFrame df = sqlContext.createDataFrame(trees, Tree.class); adresse circonfere dateplanta espece geom_x_y hauteurenm varieteouc COURS ALBERT 1ER 140.0 Aesculus hippocas... 48.8648454814, 2.... 10.0 PLACE DES TERNES 100.0 Tilia platyphyllos 48.8782668139, 2.... 15.0 BOULEVARD MALESHE... 38.0 Platanus x hispanica 48.889306184, 2.3... 0.0 QUAI BRANLY 65.0 1996-02-29 Paulownia tomentosa 48.8599934405, 2.... 10.0 df.printSchema(); df.show(); root |-- adresse: string (nullable = true) |-- circonfere: string (nullable = true) |-- dateplanta: string (nullable = true) |-- espece: string (nullable = true) |-- geom_x_y: string (nullable = true) |-- hauteurenm: float (nullable = false) |-- varieteouc: string (nullable = true)
  • 24.
    ● Comptage d’arbrespar espèce DataFrames - DSL espece COUNT(1) Acacia dealbata 2 Acer acerifolius 39 Acer buergerianum 14 Acer campestre 452 Acer cappadocicum 111 ... DataFrame df = sqlContext.createDataFrame(trees, Tree.class); df .select(df.col("espece")) .where(df.col("espece").notEqual("")) .groupBy(df.col("espece")) .agg(Collections.singletonMap("*", "count")) .sort("espece") .show();
  • 25.
    ● Exploitation d’unDataFrame en SQL ● Moteur d’exécution SQL : convertit les requêtes en instructions de base Spark SQL
  • 26.
    ● Comptage d’arbrespar espèce Spark SQL - Requêtage sqlContext.sql("SELECT espece, COUNT(*) FROM tree WHERE espece <> '' GROUP BY espece ORDER BY espece") .show(); espece c1 Acacia dealbata 2 Acer acerifolius 39 Acer buergerianum 14 Acer campestre 452 Acer cappadocicum 111 ...
  • 27.
  • 28.
    Topologie & Terminologie ●Un master / des workers ○ (+ un master en standby) ● On soumet une application ● Exécution pilotée par un driver
  • 29.
    Spark en cluster Plusieursoptions ● YARN ● Mesos ● Standalone ○ Workers démarrés individuellement ○ Workers démarrés par le master
  • 30.
    MapReduce ● Spark (API) ●Traitement distribué ● Tolérant à la panne Stockage ● HDFS, base NoSQL... ● Stockage distribué ● Tolérant à la panne Stockage & traitements
  • 31.
    Colocation données &traitement ● “Data locality” ● Traiter la donnée là où elle se trouve ● Eviter les network I/Os
  • 32.
    Colocation données &traitement Spark Worker HDFS Datanode Spark Worker HDFS Datanode Spark Worker HDFS Datanode Spark Master HDFS Namenode HDFS Namenode (Standby) Spark Master (Standby)
  • 33.
  • 34.
    Démo $ $SPARK_HOME/sbin/start-master.sh $ $SPARK_HOME/bin/spark-class org.apache.spark.deploy.worker.Worker spark://MBP-de-Alexis:7077 --cores2 --memory 2G $ mvn clean package $ $SPARK_HOME/bin/spark-submit --master spark://MBP-de-Alexis:7077 --class com.seigneurin.spark.WikipediaMapReduceByKey --deploy-mode cluster target/pres-spark-0.0.1-SNAPSHOT.jar
  • 35.
  • 36.
    Micro-batches ● Découpe unflux continu en batches ● API identique ● ≠ Apache Storm
  • 37.
    DStream ● Discretized Streams ●Séquence de RDDs ● Initialisé avec une Duration
  • 38.
    Window operations ● Fenêtreglissante ● Réutilise des données d'autres fenêtres ● Initialisé avec window length et slide interval
  • 39.
    Sources ● Socket ● Kafka ●Flume ● HDFS ● MQ (ZeroMQ...) ● Twitter ● ... ● Ou une implémentation custom de Receiver
  • 40.
  • 41.
    Démo de SparkStreaming ● Consommation de Tweets #Android ○ Twitter4J ● Détection de la langue du Tweet ○ Language Detection ● Indexation dans Elasticsearch ● Analyse dans Kibana 4
  • 42.
    $ curl -XDELETE localhost:9200 $ curl -X PUT localhost:9200/spark/_mapping/tweets '{ "tweets": { "properties": { "user": {"type": "string","index": "not_analyzed"}, "text": {"type": "string"}, "createdAt": {"type": "date","format": "date_time"}, "language": {"type": "string","index": "not_analyzed"} } } }' ● Lancer ElasticSearch Démo ● Lancer Kibana -> http://localhost:5601 ● Lancer le traitement
  • 43.