SlideShare une entreprise Scribd logo
1  sur  43
Télécharger pour lire hors ligne
www.cetic.be
Spark: Au-delà des APIs
Spark: au-delà du dataframe
www.cetic.be
Projet Tungsten
Améliorer l’efficacité CPU et RAM de Spark
www.cetic.be
Le problème
• Solutions pour améliorer l’IO
• SSD ou HDD strippé, agrégation de bande passante
• Pruning des données sur disque, format de fichier performant en
termes d’IO (cf Parquet)
• Dans de nombreux cas, la performance est limitée par la charge de calcul.
• Gestion de la mémoire gourmande en CPU
• Sérialisation/Désérialisation
• Garbage Collector
3
www.cetic.be
Apport de Tungsten: Gestion de la mémoire
• Système de pagination en RAM
• Suppression du système d’objets de la JVM
• Compactage des données
• Transformation des traitements pour travailler sur les données brutes
4
www.cetic.be
Apport de Tungsten: Gestion de la mémoire
• Système de pagination en RAM
• Suppression du système d’objets de la JVM
• Compactage des données
• Transformation des traitements pour travailler sur les données brutes
4
www.cetic.be
Apport de Tungsten: Gestion de la mémoire
• Système de pagination en RAM
• Suppression du système d’objets de la JVM
• Compactage des données
• Transformation des traitements pour travailler sur les données brutes
4
5 objets Java
Indirections
en-tête d’objet: 12 octets
char[]: 20 octets d’en-tête + 10 octets de texte
hashcode: 8 octets
total: 50 octets pour 5 caractères
www.cetic.be
Apport de Tungsten: Gestion de la mémoire
• Système de pagination en RAM
• Suppression du système d’objets de la JVM
• Compactage des données
• Transformation des traitements pour travailler sur les données brutes
4
5 objets Java
Indirections
en-tête d’objet: 12 octets
char[]: 20 octets d’en-tête + 10 octets de texte
hashcode: 8 octets
total: 50 octets pour 5 caractères
www.cetic.be
Apport de Tungsten: Gestion de la mémoire
• L’évaluation d’expressions arbitraires est très coûteuse pour la JVM
• Dispatching de fonctions polymorphes
• Comportement variable en fonction du type des objets manipulés
• Boxing/Unboxing: overhead en temps et en mémoire
• Écriture inutile en mémoire des résultats intermédiaires
5
www.cetic.be
Apport de Tungsten: Gestion de la mémoire
• L’évaluation d’expressions arbitraires est très coûteuse pour la JVM
• Dispatching de fonctions polymorphes
• Comportement variable en fonction du type des objets manipulés
• Boxing/Unboxing: overhead en temps et en mémoire
• Écriture inutile en mémoire des résultats intermédiaires
5
• Réponse : Évaluation des
expressions, génération de
(byte)code ad hoc qui
supprime ces étapes
intermédiaires. ie, compilation
des expressions.
• Backends: JVM, LLVM, GPU, …
Temps
(sec)
0
10
20
30
40
Interprété Code généré Manuel
9,33
9,36
36,65
www.cetic.be
Pour aller plus loin
• https://spoddutur.github.io/spark-notes/
second_generation_tungsten_engine.html
• https://jaceklaskowski.gitbooks.io/mastering-spark-sql/spark-sql-
tungsten.html
• https://www.slideshare.net/SparkSummit/deep-dive-into-project-
tungsten-josh-rosen
6
www.cetic.be
Projet Catalyst
Optimiser les requêtes sur données structurées
www.cetic.be
Le problème
• Spark introduit des APIs de plus en plus abstraites: Dataframe/
Dataset, SQL, … : Structured APIs
• Objectif: expression plus aisée des traitements, même API pour
le batch et le streaming
8
www.cetic.be
Le problème
• Spark introduit des APIs de plus en plus abstraites: Dataframe/
Dataset, SQL, … : Structured APIs
• Objectif: expression plus aisée des traitements, même API pour
le batch et le streaming
8
data .map { case (dpt, age) => dpt -> (age, 1) }
.reduceByKey { case ((a1, c1), (a2, c2)) => (a1 + a2, c1 + c2) }
.map { case (dpt, (age, c)) => dpt -> age / c }
RDD
www.cetic.be
Le problème
• Spark introduit des APIs de plus en plus abstraites: Dataframe/
Dataset, SQL, … : Structured APIs
• Objectif: expression plus aisée des traitements, même API pour
le batch et le streaming
8
data .map { case (dpt, age) => dpt -> (age, 1) }
.reduceByKey { case ((a1, c1), (a2, c2)) => (a1 + a2, c1 + c2) }
.map { case (dpt, (age, c)) => dpt -> age / c }
RDD
data.groupBy(‘’dept’’).avg(‘’age’’)
select dept, avg(age) from data group by dept
DataFrame
SQL
www.cetic.be
Le problème
• Il faut convertir une transformation exprimée en Structured API en
un plan d’actions exécutable.
• Le plan doit être exécuté par les workers sous la supervision du
driver.
• Plusieurs plans peuvent concrétiser une transformation. Il faut
donc choisir le meilleur plan.
• Réponse: Catalyst optimise la manière de transformer un
traitement abstrait en plan d’actions exécutable.
9
www.cetic.be
Étape 1 : résolution & planification logique
SQL
DataFrame
DataSet
AST
www.cetic.be
Étape 1 : résolution & planification logique
Plan logique
non résolu
SQL
DataFrame
DataSet
AST
www.cetic.be
Étape 1 : résolution & planification logique
Plan logique
non résolu
SQL
DataFrame
DataSet
AST
Plan logique
résolu
Analyse
Typage,
suppression
d’alias, etc.
www.cetic.be
Étape 1 : résolution & planification logique
Plan logique
non résolu
SQL
DataFrame
DataSet
AST
Plan logique
résolu
Analyse
Typage,
suppression
d’alias, etc.
Plan logique
optimisé
Optimisation logique
Règles de
transformation
www.cetic.be
Étape 1 : Exemple de règle de transformation
1 + 2 + t1.value
www.cetic.be
Étape 1 : Exemple de règle de transformation
1 + 2 + t1.value
Add
Add
Literal(1) Literal(2)
Attribute(t1.value)
www.cetic.be
Étape 1 : Exemple de règle de transformation
1 + 2 + t1.value
Add
Add
Literal(1) Literal(2)
Attribute(t1.value)
Évalué à chaque ligne
www.cetic.be
Étape 1 : Exemple de règle de transformation
1 + 2 + t1.value
Add
Add
Literal(1) Literal(2)
Attribute(t1.value)
Évalué à chaque ligne
Add(Literal(x), Literal(y)) ! Literal(x+y)
www.cetic.be
Étape 1 : Exemple de règle de transformation
1 + 2 + t1.value
Add
Add
Literal(1) Literal(2)
Attribute(t1.value)
Évalué à chaque ligne
Add(Literal(x), Literal(y)) ! Literal(x+y)
Add
Literal(3) Attribute(t1.value)
www.cetic.be
Étape 1 : Exemple de règle de transformation
1 + 2 + t1.value
Add
Add
Literal(1) Literal(2)
Attribute(t1.value)
Évalué à chaque ligne
Add(Literal(x), Literal(y)) ! Literal(x+y)
Add
Literal(3) Attribute(t1.value)
Évalué une seule fois
www.cetic.be
Étape 2 : planification physique & génération de code
12
Plan logique
optimisé
www.cetic.be
Étape 2 : planification physique & génération de code
12
Plan logique
optimisé
Plan physique 1
Plan physique 2
…
Génération de plans: lecture des
sources, predicate pushdown,
utilisation de cache, pipelining de
projection et de filtres, …
www.cetic.be
Étape 2 : planification physique & génération de code
12
Plan logique
optimisé
Plan physique 1
Plan physique 2
…
Génération de plans: lecture des
sources, predicate pushdown,
utilisation de cache, pipelining de
projection et de filtres, …
Plan physique
sélectionné
Stratégies + Règles + Modèle de
coûts exploitant les statistiques
des sources
www.cetic.be
Étape 2 : planification physique & génération de code
12
Plan logique
optimisé
Plan physique 1
Plan physique 2
…
Génération de plans: lecture des
sources, predicate pushdown,
utilisation de cache, pipelining de
projection et de filtres, …
Plan physique
sélectionné
Stratégies + Règles + Modèle de
coûts exploitant les statistiques
des sources
DAG de RDDs
www.cetic.be
Étape 2 : Exemple de planification physique
13
val joined = users.join(events, users.id == events.uid)
www.cetic.be
Étape 2 : Exemple de planification physique
13
val joined = users.join(events, users.id == events.uid)
Join
users events
Plan logique
www.cetic.be
Étape 2 : Exemple de planification physique
13
val joined = users.join(events, users.id == events.uid)
Sort-Merge join
[users.id = events.uid]
users events
[users trié par id] [events trié par uid]
Join
users events
Plan logique
www.cetic.be
Étape 2 : Exemple de planification physique
13
val joined = users.join(events, users.id == events.uid)
Sort-Merge join
[users.id = events.uid]
users events
[users trié par id] [events trié par uid]
www.cetic.be
Étape 2 : Exemple de planification physique
14
val joined = users.join(events, users.id == events.uid)
Sort-Merge join
[users.id = events.uid]
users events
[users trié par id] [events trié par uid]
www.cetic.be
Étape 2 : Exemple de planification physique
14
val joined = users.join(events, users.id == events.uid)
Sort-Merge join
[users.id = events.uid]
users events
[users trié par id] [events trié par uid]
Sort-Merge join
[users.id = events.uid]
Sort
[users.id]
Sort
[events.uid]
users events
www.cetic.be
Étape 2 : Exemple de planification physique
14
val joined = users.join(events, users.id == events.uid)
Sort-Merge join
[users.id = events.uid]
Sort
[users.id]
Sort
[events.uid]
users events
www.cetic.be
Étape 2 : Exemple de planification physique
15
val joined = users.join(events, users.id == events.uid)
Sort-Merge join
[users.id = events.uid]
Sort
[users.id]
Sort
[events.uid]
users events
www.cetic.be
Étape 2 : Exemple de planification physique
15
val joined = users.join(events, users.id == events.uid)
Sort-Merge join
[users.id = events.uid]
Sort
[users.id]
Sort
[events.uid]
users events
Sort-Merge join
[users.id = events.uid]
Sort
[users.id]
Sort
[events.uid]
ScanParquet
(trié par id)
ScanTable
www.cetic.be
Étape 2 : Exemple de planification physique
15
val joined = users.join(events, users.id == events.uid)
Sort-Merge join
[users.id = events.uid]
Sort
[users.id]
Sort
[events.uid]
ScanParquet
(trié par id)
ScanTable
www.cetic.be
Étape 2 : Exemple de planification physique
16
val joined = users.join(events, users.id == events.uid)
Sort-Merge join
[users.id = events.uid]
Sort
[users.id]
Sort
[events.uid]
ScanParquet
(trié par id)
ScanTable
www.cetic.be
Étape 2 : Exemple de planification physique
16
val joined = users.join(events, users.id == events.uid)
Sort-Merge join
[users.id = events.uid]
Sort
[users.id]
Sort
[events.uid]
ScanParquet
(trié par id)
ScanTable
Sort-Merge join
[users.id = events.uid]
Sort
[events.uid]
ScanParquet
(trié par id)
ScanTable
www.cetic.be
Pour aller plus loin
• https://databricks.com/glossary/catalyst-optimizer
• https://www.youtube.com/watch?v=RmUn5vHlevc
• https://databricks.com/blog/2015/04/13/deep-dive-into-spark-
sqls-catalyst-optimizer.html
• https://data-flair.training/blogs/spark-sql-optimization/
• https://developer.ibm.com/code/2017/11/30/learn-extension-
points-apache-spark-extend-spark-catalyst-optimizer/
17
www.cetic.be
La suite du programme: Spark Hands-On
Où vous
• Réaliserez vos premiers pas avec Spark
• Traquerez sans pitié des orphelins
• Développerez un modèle prédictif avec Dwayne Johnson
18

Contenu connexe

Similaire à Spark - au dela du dataframe avec Tungsten et Catalyst

Stockage et analyse temps réel d'événements avec Riak chez Booking.com
Stockage et analyse temps réel d'événements avec Riak chez Booking.comStockage et analyse temps réel d'événements avec Riak chez Booking.com
Stockage et analyse temps réel d'événements avec Riak chez Booking.comDamien Krotkine
 
Les dernières avancées HTML5 & CSS3 en action !
Les dernières avancées HTML5 & CSS3 en action !Les dernières avancées HTML5 & CSS3 en action !
Les dernières avancées HTML5 & CSS3 en action !Microsoft Technet France
 
Les dernières avancées html5 & css3 en action !
Les dernières avancées html5 & css3 en action !Les dernières avancées html5 & css3 en action !
Les dernières avancées html5 & css3 en action !davrous
 
Réussir une montée en charge avec MongoDB
Réussir une montée en charge avec MongoDBRéussir une montée en charge avec MongoDB
Réussir une montée en charge avec MongoDB MongoDB
 
Digital_Signal_Processors_TG_FULL.pdf
Digital_Signal_Processors_TG_FULL.pdfDigital_Signal_Processors_TG_FULL.pdf
Digital_Signal_Processors_TG_FULL.pdfHouBou3
 
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...Bruno Bonnin
 
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantSymfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantHugo Hamon
 
WS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - XebiaWS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - XebiaOlivier BAZOUD
 
Morning tech #2 - Démarche performance slides
Morning tech #2 - Démarche performance slidesMorning tech #2 - Démarche performance slides
Morning tech #2 - Démarche performance slidesOxalide
 
Oxalide Morning tech #2 - démarche performance
Oxalide Morning tech #2 - démarche performanceOxalide Morning tech #2 - démarche performance
Oxalide Morning tech #2 - démarche performanceLudovic Piot
 
Scrapez facilement et gratuitement
Scrapez facilement et gratuitementScrapez facilement et gratuitement
Scrapez facilement et gratuitementMadeline Pinthon
 
Conférence AFUP 20minutes.Fr
Conférence AFUP 20minutes.FrConférence AFUP 20minutes.Fr
Conférence AFUP 20minutes.FrOxalide
 
Découverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet SpartanDécouverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet SpartanMicrosoft
 
GWT : under the hood
GWT : under the hoodGWT : under the hood
GWT : under the hoodsvuillet
 
Les données transitoires (transients) vous veulent du bien
Les données transitoires (transients) vous veulent du bienLes données transitoires (transients) vous veulent du bien
Les données transitoires (transients) vous veulent du bienBoiteaweb
 
cours javascript.pptx
cours javascript.pptxcours javascript.pptx
cours javascript.pptxYaminaGh1
 
D’un modèle d'IA dans un notebook à un service temps réel : architecturons !
D’un modèle d'IA dans un notebook à un service temps réel : architecturons ! D’un modèle d'IA dans un notebook à un service temps réel : architecturons !
D’un modèle d'IA dans un notebook à un service temps réel : architecturons ! Marie-Alice Blete
 
Ingénierie de la performance au sein des mégadonnées
Ingénierie de la performance au sein des mégadonnéesIngénierie de la performance au sein des mégadonnées
Ingénierie de la performance au sein des mégadonnéesDaniel Lemire
 
3 Microsoft Advanced Threat Analytics - Genève
3   Microsoft Advanced Threat Analytics - Genève3   Microsoft Advanced Threat Analytics - Genève
3 Microsoft Advanced Threat Analytics - GenèveaOS Community
 
Alfresco Meetup - ETL Connector & Talend
Alfresco Meetup - ETL Connector & TalendAlfresco Meetup - ETL Connector & Talend
Alfresco Meetup - ETL Connector & TalendMarc Dutoo
 

Similaire à Spark - au dela du dataframe avec Tungsten et Catalyst (20)

Stockage et analyse temps réel d'événements avec Riak chez Booking.com
Stockage et analyse temps réel d'événements avec Riak chez Booking.comStockage et analyse temps réel d'événements avec Riak chez Booking.com
Stockage et analyse temps réel d'événements avec Riak chez Booking.com
 
Les dernières avancées HTML5 & CSS3 en action !
Les dernières avancées HTML5 & CSS3 en action !Les dernières avancées HTML5 & CSS3 en action !
Les dernières avancées HTML5 & CSS3 en action !
 
Les dernières avancées html5 & css3 en action !
Les dernières avancées html5 & css3 en action !Les dernières avancées html5 & css3 en action !
Les dernières avancées html5 & css3 en action !
 
Réussir une montée en charge avec MongoDB
Réussir une montée en charge avec MongoDBRéussir une montée en charge avec MongoDB
Réussir une montée en charge avec MongoDB
 
Digital_Signal_Processors_TG_FULL.pdf
Digital_Signal_Processors_TG_FULL.pdfDigital_Signal_Processors_TG_FULL.pdf
Digital_Signal_Processors_TG_FULL.pdf
 
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...
 
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantSymfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
 
WS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - XebiaWS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - Xebia
 
Morning tech #2 - Démarche performance slides
Morning tech #2 - Démarche performance slidesMorning tech #2 - Démarche performance slides
Morning tech #2 - Démarche performance slides
 
Oxalide Morning tech #2 - démarche performance
Oxalide Morning tech #2 - démarche performanceOxalide Morning tech #2 - démarche performance
Oxalide Morning tech #2 - démarche performance
 
Scrapez facilement et gratuitement
Scrapez facilement et gratuitementScrapez facilement et gratuitement
Scrapez facilement et gratuitement
 
Conférence AFUP 20minutes.Fr
Conférence AFUP 20minutes.FrConférence AFUP 20minutes.Fr
Conférence AFUP 20minutes.Fr
 
Découverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet SpartanDécouverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet Spartan
 
GWT : under the hood
GWT : under the hoodGWT : under the hood
GWT : under the hood
 
Les données transitoires (transients) vous veulent du bien
Les données transitoires (transients) vous veulent du bienLes données transitoires (transients) vous veulent du bien
Les données transitoires (transients) vous veulent du bien
 
cours javascript.pptx
cours javascript.pptxcours javascript.pptx
cours javascript.pptx
 
D’un modèle d'IA dans un notebook à un service temps réel : architecturons !
D’un modèle d'IA dans un notebook à un service temps réel : architecturons ! D’un modèle d'IA dans un notebook à un service temps réel : architecturons !
D’un modèle d'IA dans un notebook à un service temps réel : architecturons !
 
Ingénierie de la performance au sein des mégadonnées
Ingénierie de la performance au sein des mégadonnéesIngénierie de la performance au sein des mégadonnées
Ingénierie de la performance au sein des mégadonnées
 
3 Microsoft Advanced Threat Analytics - Genève
3   Microsoft Advanced Threat Analytics - Genève3   Microsoft Advanced Threat Analytics - Genève
3 Microsoft Advanced Threat Analytics - Genève
 
Alfresco Meetup - ETL Connector & Talend
Alfresco Meetup - ETL Connector & TalendAlfresco Meetup - ETL Connector & Talend
Alfresco Meetup - ETL Connector & Talend
 

Plus de Mathieu Goeminne

Utilisation de l’IA dans le manufacturing - Retour d'expérience
Utilisation de l’IA dans le manufacturing - Retour d'expérienceUtilisation de l’IA dans le manufacturing - Retour d'expérience
Utilisation de l’IA dans le manufacturing - Retour d'expérienceMathieu Goeminne
 
Se noyer dans les yeux de Cassandre
Se noyer dans les yeux de CassandreSe noyer dans les yeux de Cassandre
Se noyer dans les yeux de CassandreMathieu Goeminne
 
SMACK : Une pile logicielle open source pour le traitement big data
SMACK : Une pile logicielle open source pour le traitement big dataSMACK : Une pile logicielle open source pour le traitement big data
SMACK : Une pile logicielle open source pour le traitement big dataMathieu Goeminne
 
Du capteur à l'amélioration de procédés - Opportunités du machine learning po...
Du capteur à l'amélioration de procédés - Opportunités du machine learning po...Du capteur à l'amélioration de procédés - Opportunités du machine learning po...
Du capteur à l'amélioration de procédés - Opportunités du machine learning po...Mathieu Goeminne
 
De la collecte des données à l’exploitation de modèles -- Utilisation de SMAC...
De la collecte des données à l’exploitation de modèles -- Utilisation de SMAC...De la collecte des données à l’exploitation de modèles -- Utilisation de SMAC...
De la collecte des données à l’exploitation de modèles -- Utilisation de SMAC...Mathieu Goeminne
 
L'intelligence artificielle au sein des entreprises wallonnes
L'intelligence artificielle au sein des entreprises wallonnesL'intelligence artificielle au sein des entreprises wallonnes
L'intelligence artificielle au sein des entreprises wallonnesMathieu Goeminne
 
Intelligence artificielle : la situation dans les entreprises wallonnes
Intelligence artificielle : la situation dans les entreprises wallonnesIntelligence artificielle : la situation dans les entreprises wallonnes
Intelligence artificielle : la situation dans les entreprises wallonnesMathieu Goeminne
 
Introduction au Machine Learning
Introduction au Machine LearningIntroduction au Machine Learning
Introduction au Machine LearningMathieu Goeminne
 
Co-Evolving Code-Related and Database-related Changes in Data Intensive Softw...
Co-Evolving Code-Related and Database-related Changes in Data Intensive Softw...Co-Evolving Code-Related and Database-related Changes in Data Intensive Softw...
Co-Evolving Code-Related and Database-related Changes in Data Intensive Softw...Mathieu Goeminne
 

Plus de Mathieu Goeminne (9)

Utilisation de l’IA dans le manufacturing - Retour d'expérience
Utilisation de l’IA dans le manufacturing - Retour d'expérienceUtilisation de l’IA dans le manufacturing - Retour d'expérience
Utilisation de l’IA dans le manufacturing - Retour d'expérience
 
Se noyer dans les yeux de Cassandre
Se noyer dans les yeux de CassandreSe noyer dans les yeux de Cassandre
Se noyer dans les yeux de Cassandre
 
SMACK : Une pile logicielle open source pour le traitement big data
SMACK : Une pile logicielle open source pour le traitement big dataSMACK : Une pile logicielle open source pour le traitement big data
SMACK : Une pile logicielle open source pour le traitement big data
 
Du capteur à l'amélioration de procédés - Opportunités du machine learning po...
Du capteur à l'amélioration de procédés - Opportunités du machine learning po...Du capteur à l'amélioration de procédés - Opportunités du machine learning po...
Du capteur à l'amélioration de procédés - Opportunités du machine learning po...
 
De la collecte des données à l’exploitation de modèles -- Utilisation de SMAC...
De la collecte des données à l’exploitation de modèles -- Utilisation de SMAC...De la collecte des données à l’exploitation de modèles -- Utilisation de SMAC...
De la collecte des données à l’exploitation de modèles -- Utilisation de SMAC...
 
L'intelligence artificielle au sein des entreprises wallonnes
L'intelligence artificielle au sein des entreprises wallonnesL'intelligence artificielle au sein des entreprises wallonnes
L'intelligence artificielle au sein des entreprises wallonnes
 
Intelligence artificielle : la situation dans les entreprises wallonnes
Intelligence artificielle : la situation dans les entreprises wallonnesIntelligence artificielle : la situation dans les entreprises wallonnes
Intelligence artificielle : la situation dans les entreprises wallonnes
 
Introduction au Machine Learning
Introduction au Machine LearningIntroduction au Machine Learning
Introduction au Machine Learning
 
Co-Evolving Code-Related and Database-related Changes in Data Intensive Softw...
Co-Evolving Code-Related and Database-related Changes in Data Intensive Softw...Co-Evolving Code-Related and Database-related Changes in Data Intensive Softw...
Co-Evolving Code-Related and Database-related Changes in Data Intensive Softw...
 

Spark - au dela du dataframe avec Tungsten et Catalyst

  • 1. www.cetic.be Spark: Au-delà des APIs Spark: au-delà du dataframe
  • 3. www.cetic.be Le problème • Solutions pour améliorer l’IO • SSD ou HDD strippé, agrégation de bande passante • Pruning des données sur disque, format de fichier performant en termes d’IO (cf Parquet) • Dans de nombreux cas, la performance est limitée par la charge de calcul. • Gestion de la mémoire gourmande en CPU • Sérialisation/Désérialisation • Garbage Collector 3
  • 4. www.cetic.be Apport de Tungsten: Gestion de la mémoire • Système de pagination en RAM • Suppression du système d’objets de la JVM • Compactage des données • Transformation des traitements pour travailler sur les données brutes 4
  • 5. www.cetic.be Apport de Tungsten: Gestion de la mémoire • Système de pagination en RAM • Suppression du système d’objets de la JVM • Compactage des données • Transformation des traitements pour travailler sur les données brutes 4
  • 6. www.cetic.be Apport de Tungsten: Gestion de la mémoire • Système de pagination en RAM • Suppression du système d’objets de la JVM • Compactage des données • Transformation des traitements pour travailler sur les données brutes 4 5 objets Java Indirections en-tête d’objet: 12 octets char[]: 20 octets d’en-tête + 10 octets de texte hashcode: 8 octets total: 50 octets pour 5 caractères
  • 7. www.cetic.be Apport de Tungsten: Gestion de la mémoire • Système de pagination en RAM • Suppression du système d’objets de la JVM • Compactage des données • Transformation des traitements pour travailler sur les données brutes 4 5 objets Java Indirections en-tête d’objet: 12 octets char[]: 20 octets d’en-tête + 10 octets de texte hashcode: 8 octets total: 50 octets pour 5 caractères
  • 8. www.cetic.be Apport de Tungsten: Gestion de la mémoire • L’évaluation d’expressions arbitraires est très coûteuse pour la JVM • Dispatching de fonctions polymorphes • Comportement variable en fonction du type des objets manipulés • Boxing/Unboxing: overhead en temps et en mémoire • Écriture inutile en mémoire des résultats intermédiaires 5
  • 9. www.cetic.be Apport de Tungsten: Gestion de la mémoire • L’évaluation d’expressions arbitraires est très coûteuse pour la JVM • Dispatching de fonctions polymorphes • Comportement variable en fonction du type des objets manipulés • Boxing/Unboxing: overhead en temps et en mémoire • Écriture inutile en mémoire des résultats intermédiaires 5 • Réponse : Évaluation des expressions, génération de (byte)code ad hoc qui supprime ces étapes intermédiaires. ie, compilation des expressions. • Backends: JVM, LLVM, GPU, … Temps (sec) 0 10 20 30 40 Interprété Code généré Manuel 9,33 9,36 36,65
  • 10. www.cetic.be Pour aller plus loin • https://spoddutur.github.io/spark-notes/ second_generation_tungsten_engine.html • https://jaceklaskowski.gitbooks.io/mastering-spark-sql/spark-sql- tungsten.html • https://www.slideshare.net/SparkSummit/deep-dive-into-project- tungsten-josh-rosen 6
  • 11. www.cetic.be Projet Catalyst Optimiser les requêtes sur données structurées
  • 12. www.cetic.be Le problème • Spark introduit des APIs de plus en plus abstraites: Dataframe/ Dataset, SQL, … : Structured APIs • Objectif: expression plus aisée des traitements, même API pour le batch et le streaming 8
  • 13. www.cetic.be Le problème • Spark introduit des APIs de plus en plus abstraites: Dataframe/ Dataset, SQL, … : Structured APIs • Objectif: expression plus aisée des traitements, même API pour le batch et le streaming 8 data .map { case (dpt, age) => dpt -> (age, 1) } .reduceByKey { case ((a1, c1), (a2, c2)) => (a1 + a2, c1 + c2) } .map { case (dpt, (age, c)) => dpt -> age / c } RDD
  • 14. www.cetic.be Le problème • Spark introduit des APIs de plus en plus abstraites: Dataframe/ Dataset, SQL, … : Structured APIs • Objectif: expression plus aisée des traitements, même API pour le batch et le streaming 8 data .map { case (dpt, age) => dpt -> (age, 1) } .reduceByKey { case ((a1, c1), (a2, c2)) => (a1 + a2, c1 + c2) } .map { case (dpt, (age, c)) => dpt -> age / c } RDD data.groupBy(‘’dept’’).avg(‘’age’’) select dept, avg(age) from data group by dept DataFrame SQL
  • 15. www.cetic.be Le problème • Il faut convertir une transformation exprimée en Structured API en un plan d’actions exécutable. • Le plan doit être exécuté par les workers sous la supervision du driver. • Plusieurs plans peuvent concrétiser une transformation. Il faut donc choisir le meilleur plan. • Réponse: Catalyst optimise la manière de transformer un traitement abstrait en plan d’actions exécutable. 9
  • 16. www.cetic.be Étape 1 : résolution & planification logique SQL DataFrame DataSet AST
  • 17. www.cetic.be Étape 1 : résolution & planification logique Plan logique non résolu SQL DataFrame DataSet AST
  • 18. www.cetic.be Étape 1 : résolution & planification logique Plan logique non résolu SQL DataFrame DataSet AST Plan logique résolu Analyse Typage, suppression d’alias, etc.
  • 19. www.cetic.be Étape 1 : résolution & planification logique Plan logique non résolu SQL DataFrame DataSet AST Plan logique résolu Analyse Typage, suppression d’alias, etc. Plan logique optimisé Optimisation logique Règles de transformation
  • 20. www.cetic.be Étape 1 : Exemple de règle de transformation 1 + 2 + t1.value
  • 21. www.cetic.be Étape 1 : Exemple de règle de transformation 1 + 2 + t1.value Add Add Literal(1) Literal(2) Attribute(t1.value)
  • 22. www.cetic.be Étape 1 : Exemple de règle de transformation 1 + 2 + t1.value Add Add Literal(1) Literal(2) Attribute(t1.value) Évalué à chaque ligne
  • 23. www.cetic.be Étape 1 : Exemple de règle de transformation 1 + 2 + t1.value Add Add Literal(1) Literal(2) Attribute(t1.value) Évalué à chaque ligne Add(Literal(x), Literal(y)) ! Literal(x+y)
  • 24. www.cetic.be Étape 1 : Exemple de règle de transformation 1 + 2 + t1.value Add Add Literal(1) Literal(2) Attribute(t1.value) Évalué à chaque ligne Add(Literal(x), Literal(y)) ! Literal(x+y) Add Literal(3) Attribute(t1.value)
  • 25. www.cetic.be Étape 1 : Exemple de règle de transformation 1 + 2 + t1.value Add Add Literal(1) Literal(2) Attribute(t1.value) Évalué à chaque ligne Add(Literal(x), Literal(y)) ! Literal(x+y) Add Literal(3) Attribute(t1.value) Évalué une seule fois
  • 26. www.cetic.be Étape 2 : planification physique & génération de code 12 Plan logique optimisé
  • 27. www.cetic.be Étape 2 : planification physique & génération de code 12 Plan logique optimisé Plan physique 1 Plan physique 2 … Génération de plans: lecture des sources, predicate pushdown, utilisation de cache, pipelining de projection et de filtres, …
  • 28. www.cetic.be Étape 2 : planification physique & génération de code 12 Plan logique optimisé Plan physique 1 Plan physique 2 … Génération de plans: lecture des sources, predicate pushdown, utilisation de cache, pipelining de projection et de filtres, … Plan physique sélectionné Stratégies + Règles + Modèle de coûts exploitant les statistiques des sources
  • 29. www.cetic.be Étape 2 : planification physique & génération de code 12 Plan logique optimisé Plan physique 1 Plan physique 2 … Génération de plans: lecture des sources, predicate pushdown, utilisation de cache, pipelining de projection et de filtres, … Plan physique sélectionné Stratégies + Règles + Modèle de coûts exploitant les statistiques des sources DAG de RDDs
  • 30. www.cetic.be Étape 2 : Exemple de planification physique 13 val joined = users.join(events, users.id == events.uid)
  • 31. www.cetic.be Étape 2 : Exemple de planification physique 13 val joined = users.join(events, users.id == events.uid) Join users events Plan logique
  • 32. www.cetic.be Étape 2 : Exemple de planification physique 13 val joined = users.join(events, users.id == events.uid) Sort-Merge join [users.id = events.uid] users events [users trié par id] [events trié par uid] Join users events Plan logique
  • 33. www.cetic.be Étape 2 : Exemple de planification physique 13 val joined = users.join(events, users.id == events.uid) Sort-Merge join [users.id = events.uid] users events [users trié par id] [events trié par uid]
  • 34. www.cetic.be Étape 2 : Exemple de planification physique 14 val joined = users.join(events, users.id == events.uid) Sort-Merge join [users.id = events.uid] users events [users trié par id] [events trié par uid]
  • 35. www.cetic.be Étape 2 : Exemple de planification physique 14 val joined = users.join(events, users.id == events.uid) Sort-Merge join [users.id = events.uid] users events [users trié par id] [events trié par uid] Sort-Merge join [users.id = events.uid] Sort [users.id] Sort [events.uid] users events
  • 36. www.cetic.be Étape 2 : Exemple de planification physique 14 val joined = users.join(events, users.id == events.uid) Sort-Merge join [users.id = events.uid] Sort [users.id] Sort [events.uid] users events
  • 37. www.cetic.be Étape 2 : Exemple de planification physique 15 val joined = users.join(events, users.id == events.uid) Sort-Merge join [users.id = events.uid] Sort [users.id] Sort [events.uid] users events
  • 38. www.cetic.be Étape 2 : Exemple de planification physique 15 val joined = users.join(events, users.id == events.uid) Sort-Merge join [users.id = events.uid] Sort [users.id] Sort [events.uid] users events Sort-Merge join [users.id = events.uid] Sort [users.id] Sort [events.uid] ScanParquet (trié par id) ScanTable
  • 39. www.cetic.be Étape 2 : Exemple de planification physique 15 val joined = users.join(events, users.id == events.uid) Sort-Merge join [users.id = events.uid] Sort [users.id] Sort [events.uid] ScanParquet (trié par id) ScanTable
  • 40. www.cetic.be Étape 2 : Exemple de planification physique 16 val joined = users.join(events, users.id == events.uid) Sort-Merge join [users.id = events.uid] Sort [users.id] Sort [events.uid] ScanParquet (trié par id) ScanTable
  • 41. www.cetic.be Étape 2 : Exemple de planification physique 16 val joined = users.join(events, users.id == events.uid) Sort-Merge join [users.id = events.uid] Sort [users.id] Sort [events.uid] ScanParquet (trié par id) ScanTable Sort-Merge join [users.id = events.uid] Sort [events.uid] ScanParquet (trié par id) ScanTable
  • 42. www.cetic.be Pour aller plus loin • https://databricks.com/glossary/catalyst-optimizer • https://www.youtube.com/watch?v=RmUn5vHlevc • https://databricks.com/blog/2015/04/13/deep-dive-into-spark- sqls-catalyst-optimizer.html • https://data-flair.training/blogs/spark-sql-optimization/ • https://developer.ibm.com/code/2017/11/30/learn-extension- points-apache-spark-extend-spark-catalyst-optimizer/ 17
  • 43. www.cetic.be La suite du programme: Spark Hands-On Où vous • Réaliserez vos premiers pas avec Spark • Traquerez sans pitié des orphelins • Développerez un modèle prédictif avec Dwayne Johnson 18