Traitementdedonnéesenmémoire:Introduc2onàSpark
VincentLeroy
Sources
• ResilientDistributedDatasets,HenggangCui• CourseraIntroduc2ontoApacheSpark,UniversityofCalifornia,Databricks
Organisa2ond’unDataCenter
CPUs: 10 GB/s
100 MB/s
0.1 ms random access
$0.45 per GB
600 MB/s
3-12 ms random access
$0.05 per GB
1 Gb/s or 125 MB/s
Network
0.1 Gb/s
Nodes in another rack
Nodes in same rack
1 Gb/s or 125 MB/s
Datacenter Organization
Exécu2onHadoopMapReduceMap Reduce: Distributed Execution
MAP REDUCEEach stage passes through the hard drives
Passageparledisqueàchaqueétape
TraitementsItéra2fs
• I/Odisqueàchaquerépé22onàLentpourbeaucoupdepe2tesitéra2ons
Map Reduce: Iterative Jobs• Iterative jobs involve a lot of disk I/O for each repetition
Stag
e 1
Stag
e 2
Stag
e 3
Disk I/O is very slow!
CoûtmémoireTech Trend: Cost of Memory
PRIC
E
YEAR
Memory
disk flash
http://www.jcmit.com/mem2014.htm
2010: 1 ¢/MB
Lower cost means can put more memory in each server
Descoûtsplusbasfontqu’onpeutmeNreplusdemémoireparserveur
TraitementenMémoire(RAM)
• Beaucoupdejeuxdedonnées2ennentenRAM(1ouplusieursmachines)
• LaRAMestrapideetévitelesI/Odisque
àPlateformedetraitementSpark
RemplacerleDisqueparlaRAMUse Memory Instead of Disk
iteration 1 iteration 2 . . .Input
HDFS read
HDFS write
HDFS read
HDFS write
Input
query 1
query 2
query 3
result 1
result 2
result 3
. . .
HDFS read
RemplacerleDisqueparlaRAM
In-Memory Data Sharing
iteration 1 iteration 2 . . .Input
HDFS read
Input
query 1
query 2
query 3
result 1
result 2
result 3. . .
one-time processing
Distributedmemory
10-100x faster than network and disk
ArchitecturedeSparkApache Spark Components
Apache Spark
Spark Streaming
Spark SQL
MLlib & ML
(machine learning)
GraphX (graph)
ResilientDistributedDatasets(RDDs)
RDD
• Collec2ondedonnées– Distribuée– Enlecture-seule– Enmémoire– CrééedepuisunstockagefiableouunautreRDD
Créa2ond’uneRDD
Parallelize
# Parallelize in Python wordsRDD = sc.parallelize(["fish", "cats", "dogs"])
Take an existing in-memory collection and pass it to SparkContext’s parallelize method
There are other methods to read data from HDFS, C*, S3, HBase, etc.
Read from Text File # Read a local txt file in Python linesRDD = sc.textFile("/path/to/README.md")
Create a Base RDD
Parallelize:Prendunecollec2onclassiqueexistanteenmémoireetlatransformeenRDD
LecturedepuisunfichiertexteD’autresméthodesexistentpourliredepuisHDFS,S3,Hbase…
Opéra2onssurlesRDDs
• Transforma2ons:évalua2onparesseuse– Map,filter,intersec2on,groupByKey,reduceByKey,zipWithIndex…
• Ac2ons:déclenchentl’exécu2ondestransforma2ons– Collect,count,reduce,saveAsTextFile…
• Miseencache– Évitel’exécu2onrépétéedetransforma2onspourréu2liseruneRDD
ExempledeRDD
Error, ts, msg1 Warn, ts, msg2 Error, ts, msg1
Info, ts, msg8 Warn, ts, msg2 Info, ts, msg8
Error, ts, msg3 Info, ts, msg5 Info, ts, msg5
Error, ts, msg4 Warn, ts, msg9 Error, ts, msg1
logLinesRDD
Error, ts, msg1 Error, ts, msg1
Error, ts, msg3
Error, ts, msg4 Error, ts, msg1
errorsRDD
.filter( )
(input/base RDD)
λ
ExempledeRDD
errorsRDD
.coalesce(2)
Error, ts, msg1 Error, ts, msg3 Error, ts, msg1
Error, ts, msg4 Error, ts, msg1
cleanedRDD
Error, ts, msg1 Error, ts, msg1
Error, ts, msg3
Error, ts, msg4 Error, ts, msg1
.collect( )
Driver
Lignéed’uneRDD
.collect()
logLinesRDD
errorsRDD
cleanedRDD
.filter( )
.coalesce( 2 )
Driver
λ
DAG
Exécu2on
Driver
logLinesRDD
errorsRDD
cleanedRDD
Execution
Toléranceauxpannes
• Hadoop:poli2quepessimiste,encasdecrashonperdpeumaiscoûtsd’I/Oélevéspourtouteslesexécu2ons
• Spark:poli2queop2miste,onnepaiepaslatoléranceauxpannes,maisencasdecrashondoitrecalculerenu2lisantlalignéedelaRDD
DépendancesdeRDDRDD Dependencies
13
DépendancesdeRDD
• Dépendancesétroites(narrow)– Permetd’enchainerl’exécu2onsurunnœudducluster,sansbarrière
– Crashpeucoûteux,reconstruc2onisolée• Dépendanceslarges– Nécessitentlesdonnéesdetouteslespar22onsparentes,barrièredansl’exécu2on
– Crashcoûteux,ilfautreconstruirelesdonnéesdetouteslesmachines
Ordonnancementdel’exécu2on
• Pourexécuterdesac2onssuruneRDD– L’ordonnanceurdécoupel’exécu2onenétapesenu2lisantlalignéedelaRDD
– Chaqueétapecon2entautantd’opéra2onsàdépendanceétroitequepossible
Ordonnancementd’exécu2onJob Scheduling
16
ExempledeRDD
• ShellSparkinterac2fscala> val wc = lesMiserables.flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_)
wc: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[5] at reduceByKey at <console>:14scala> wc.take(5).foreach(println)(créanciers;,1)(abondent.,1)(plaisir,,5)(déplaçaient,1)(sociale,,7)scala> val cw = wc.map(p => (p._2, p._1))
cw: org.apache.spark.rdd.RDD[(Int, String)] = MappedRDD[5] at map at <console>:16scala> val sortedCW = cw.sortByKey(false)
sortedCW: org.apache.spark.rdd.RDD[(Int, String)] = ShuffledRDD[11] at sortByKey at <console>:18scala> sortedCW.take(5).foreach(println)(16757,de)(14683,)(11025,la)(9794,et)(8471,le)scala> sortedCW.filter(x => "Cosette".equals(x._2)).collect.foreach(println)(353,Cosette)
Wordcount en Spark
DataFrames
Défini2ond’uneDataFrame
• Collec2ondedonnées– Organiséesencolonnes– SchémadesdonnéesàprochedesRDBMS
• Implémenta2on– ReposesurdesRDD(toléranceauxpannes…)– Plushautniveau,langagetypeSQLàpermetd’avantaged’op2misa2ons(ordonnancementdesopéra2ons,projetTungsten…)
ExempledeDataFrame
Quelquesno2onsdeScala
Scala
• Langagedeprogramma2onfonc2onnelle– Typagefortetsta2que– Compila2onenByteCodeJava– InteropérableavecJava
• Langagedéveloppéàl’EPFL– Adoptépardegrandsprojetsopen-source(Spark…)etindustriels(TwiNer…)
ExemplesdeScaladanslecontextedeSpark
ClasseScala