Traitement de données en mémoire : Introduc2on à...

Post on 19-Mar-2018

217 views 1 download

Transcript of Traitement de données en mémoire : Introduc2on à...

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