4 Exemples de problèmes MapReduce...
Transcript of 4 Exemples de problèmes MapReduce...
4 Exemples de problèmes MapReduce incrémentaux
Calcul des plus courtes distances à un noeud d’un graphe
Calcul des plus courts chemins entre toutes les paires denoeuds d’un graphe
Algorithme PageRank
Regression Logistique
1 / 32
Calcul des plus courtes distances à un noeud d’ungraphe
Quelles Entrées ?
Quelles Transformations Map ?
Quelles Clés de Regroupement ?
Quelles opérations de réduction ?2 / 32
Calcul des plus courtes distances à un noeud d’ungraphe
Données :Structure de Noeud n:
n.id : identifiant du noeud nn.adjacencyList : Liste d’adjacence S(n) du noeud nn.dist : Distance du noeud n au noeud de départ start(initialisée à ∞ pour tous les noeuds sauf start)
Formulation (BFS):start .dist = 0Pour tout noeud n atteignable par un ensemble de noeudsM, n.dist = 1+ min
m∈Mm.dist
3 / 32
Calcul des plus courtes distances à un noeud d’ungraphe
Breadth First Search: Job MapReduce
Map( n ) {Emettre ( n . id , n ) ;Si (n.dist <∞ ) :
Pour t o u t id ∈ n.adjacencyList :dist ← n.dist +1Emettre ( id ,Node ( id ,m.dist ,; ) ) ;
}
Reduce ( nid , nodes ) {min ←∞ ;nmin ←; ;adj ←; ;Pour t o u t n ∈ nodes :
Si (n.adjacencyList 6= ; ) : adj ← n.adjacencyListSi ( ( nmin ==; ) ou (n.dist <min ) ) :
min ← n.dist ;nmin ← n
nmin.adjacencyList ← adj ;Emettre ( nmin ) ;
}
4 / 32
Calcul des plus courts chemins entre toutes les pairesde noeuds d’un graphe
Quelles Entrées ?
Quelles Transformations Map ?
Quelles Clés de Regroupement ?
Quelles opérations de réduction ?5 / 32
Calcul des plus courts chemins entre toutes les pairesde noeuds d’un graphe
Données :Chemins C entre paire de noeuds:
C.start : noeud de departC.end : noeud de finC.dist : distance (nbre de liens à suivre pour atteindre C.endà partir de C.startC.shortests: Ensemble de chemins de C.start à C.end dedistance C.dist
Formulation :Pour tout couple de noeuds u,v tel qu’il existe un lien entreu et v , la distance minimale D(u,v) est : D(u,v)= 1Pour tout couple de noeuds u,v non directement lié :D(u,v)=min
m(D(u,m)+D(m,v))
6 / 32
Calcul des plus courts chemins entre toutes les pairesde noeuds d’un graphe
Calcul des plus courts chemins: Job MapReduce
Map( p ) {Emettre ( p . s t a r t , p ) ;Si ( p . new ) : Emettre ( p . end , p ) ;
}
Reduce ( node , L i s tPa ths ) {P ←;;Ends ←;;Starts ←;Pour t o u t p ∈ ListPaths :
p.new ←False ;Si ( p . s t a r t ==node ) : Ends =Ends∪p ;Sinon : Starts =Starts∪p ;
Pour t o u t ep ∈Ends :P[ep.start ,ep.end ]= ep ;Pour t o u t sp ∈Starts :
Si ( sp . s t a r t ==ep . s t a r t ) : cont inue ;d ← sp.dist +ep.dist ;p ←P[sp.start ,ep.end ] ;Si ( ( p== n u l l ) ou ( p . d i s t >=d ) ) :
newp ←Fusion(sp,ep) ;Si ( p . d i s t ==d ) :
p.shortests ← p.shortests∪newp.shortests ;Sinon :
P[sp.start ,ep.end ]← newp ;Pour t o u t p ∈P : Emettre ( p ) ;
}
7 / 32
Algorithme PageRank
PageRank simule le comportement d’un surfeur aléatoire:1 au temps t , le sufeur est sur la page pt ,2 avec une probabilité d , il clique aléatoirement sur un lien de
pt . pt+1 est alors la page pointée par ce lien.3 avec une probabilité 1−d , pt+1 est une page Web choisie
aléatoirement.4 retour à l’étape 1.
AvecPi : l’ensemble des pages pointant vers la page i`j : le nombre de liens sortant de la page j
Probabilité µti que le surfeur soit sur la page i au temps t =
µt+1 = 1−dN
1+dAµt avec Aij ={ 1`j
si j ∈Pi
0 sinonet N : #pages Web.
8 / 32
Algorithme PageRank
µt+1 = 1−dN
1+dAµt avec Aij ={ 1`j
si j ∈Pi
0 sinonet N : #pages Web.
Quelles Entrées ?
Quelles Transformations Map ?
Quelles Clés de Regroupement ?
Quelles opérations de réduction ?
9 / 32
Algorithme PageRank
Avec d=1 :
10 / 32
Algorithme PageRank
Avec d=1 :
11 / 32
Algorithme PageRank
Avec d=1 :
12 / 32
Algorithme PageRank
Données :Structure de Noeud n:
n.id : identifiant du noeud nn.adjacencyList : Liste d’adjacence S(n) du noeud nn.p: score PageRank à l’iteration courante
Formulation :
Pour tout noeud n: n.pt0 = 1N
Pour tout noeud n atteignable par un ensemble de noeuds
M, n.pt+1 = 1−dN
+d∑
m∈M
m.pt
|m.adjacencyList |
13 / 32
Algorithme PageRank
PageRank: Job MapReduce
Map( n ) {
np ← n.p|m.adjacencyList |
n.p ← 0Emettre ( n . id , n ) ;Pour t o u t id ∈ n.adjacencyList :
Emettre ( id ,Node ( id ,;,np ) ) ;}
Reduce ( nid , nodes ) {sum ← 0 ;adj ←; ;Pour t o u t n ∈ nodes :
Si (n.adjacencyList 6= ; ) : adj ← n.adjacencyList ;sum ← sum+n.p ;
Emettre (Node (nid ,adj ,1−d
N+d ×sum ) ) ;
}
14 / 32
Regression Logistique
Hypothèse :Rapport de probas conditionnelles peut être modélisé parune application linéaireln p(1|x)
1−p(1|x) = θ.x
⇒ p(1|X )= eθ.x
1+eθ.x = 11+e−θ.x
Maximum de vraissemblanceθ∗ = argmax
θ
∑ni yi ln( 1
1+e−θ.x )+ (1−yi)ln(1− 11+e−θ.x )
Gradient :∑n
i xi(yi − 11+e−θ.x )
15 / 32
Regression Logistique
Estimation du maximum de vraissemblance par montée degradient :
θt+1 = θt +αn∑i
xi(yi −1
1+e−θ.x )
Quelles Entrées ?
Quelles Transformations Map ?
Quelles Clés de Regroupement ?
Quelles opérations de réduction ?
16 / 32
Regression Logistique
Données :Item =
item.x : Vecteur de features de nbDims dimensionsitem.y : Score à prédire
Entrées fixes, seul θ varie
Formulation:θt+1 = θt +α∑n
i xi(yi − 11+e−θ.x )
17 / 32
Regression Logistique
Montée de gradient: Job MapReduce
Map( i tem ) {Pour i de 1 à nbDims :
Emettre ( i , item.xi (item.y − 11+e−<θ,item.x> ) ) ;
}
Reduce ( i , g rad ien ts ) {sumg ← 0 ;Pour t o u t g ∈ gradients :
sumg ← sumg+gEmettre ( i , thetai +α×sumg ) ;
}
18 / 32
Hadoop Map Reduce: Echaînement de Jobs
Resultats en tant que nouvelles entrées du MapReduce⇒ Ecriture/Lecture des resultats dans des SequenceFile
Ecriture/Lecture des resultats dans des fichiersDe préférence SequenceFile :job.setOuputFormat(SequenceFileOutputFormat.class)A l’iteration suivante, lecture à partir d’un SequenceFile :job.setInputFormat(SequenceFileInputFormat.class)
Resultats en tant que données en RAM ⇒ Entrées fixesEntrées fixesParamètres lus à partir de fichiers resultats
19 / 32
Hadoop Map Reduce vs Spark
Hadoop Map Reduce: InconvénientsBeaucoup de lectures/ecritures sur disquePas de mise en mémoire vive
SparkMise en oeuvre d’une mémoire partagéeSimplification des process
⇒ Jusqu’à 10x fois plus rapide sur disque⇒ Jusqu’à 100x fois plus rapide sur disque⇒ Code plus compact⇒ Mieux adapté pour l’apprentissage statistique
20 / 32
Spark
Contexte SparkDéfinit les opérations Spark à effectuer sur les collectionsde données
Spark: Initialisation
impor t org . apache . spark . SparkConf ;impor t org . apache . spark . ap i . java . JavaSparkContext ;
SparkConf sparkConf = new SparkConf ( ) . setAppName (name ) ;JavaSparkContext sc = new JavaSparkContext ( sparkConf ) ;
21 / 32
SparkResilient Distributed Datasets (RDD)
Collections d’éléments manipulables en parallèleDeux manières de créer des RDDs:
Parallelisation d’une collection en mémoireSpark: Collection parallelisée
impor t org . apache . spark . ap i . java . JavaRDD ;L i s t < In teger > data = Arrays . a s L i s t (1 , 2 , 3 , 4 , 5 ) ;JavaRDD<In teger > d is tDa ta = sc . p a r a l l e l i z e ( data ) ;
Référencement d’un dataset sur un système de fichierdistribué comme HDFS
Spark: Initialisation
impor t org . apache . spark . ap i . java . JavaRDD ;
/ / F i c h i e r ( s ) t ex te à l i r e l i g n e par l i g n eJavaRDD<St r ing > d i s t F i l e = sc . t e x t F i l e ( " data " ) ;
/ / F i c h i e r s t ex te e n t i e r sJavaRDD<St r ing > d i s t F i l e = sc . wholeTextF i les ( " data " ) ;
/ / F i c h i e r ( s ) SequenceFile avec K et V des types de données étendant Wr i tab leJavaRDD<St r ing > d i s t F i l e = sc . sequenceFi le [K, V ] ( " data " ) ;
/ / Autres types de f i c h i e r s avec Reader HadoopJavaRDD<St r ing > d i s t F i l e = sc .newHadoopRDD ( " data " ) ;
22 / 32
Spark
Deux types d’operations sur les RDDTransformations
Création de nouveaux RDD par application d’unetransformation
map, flatMap, filter, reduceByKey, join, etc..."Lazy" operations => effectué uniquement lorsqu’une actionest requise sur le resultat de la transformation
Moins de résultats à retournerPlannification des tâches facilitée
ActionsOpération produisant un résultat
reduce, takeSample, count(), etc...saveAsTextFile, saveAsSequenceFile, etc...
23 / 32
Spark
Persistence des RDDSi besoin de réutiliser le résultat d’une transformationplusieurs foisrdd.persist(StorageLevel.level): stocke le RDD pourutilisation ultérieure
Différents types de stockage:MEMORY_ONLY : Stocke les RDD en tant qu’objets Javadéserialisés en mémoire vive. Si une partie ne tient pas enmémoire, elle sera re-calculée lorsque l’on en aura besoinMEMORY_AND_DISK : Stocke les RDD en tant qu’objetsJava déserialisés en mémoire vive, mais si une partie netient pas en mémoire, on l’écrit sur disqueDISK_ONLY : Stocke les RDD sur disqueMEMORY_ONLY_SER et MEMORY_AND_DISK_SER :Identique à MEMORY_ONLY et MEMORY_AND_DISKmais stocke les objets après sérialisation. Plus léger enmémoire mais plus lent à reconstruire.
24 / 32
Spark
25 / 32
Spark
FonctionsDéfinition de fonction à passer aux opérations
Function : 1 argument en entrée, chaque valeur du dataset(map)Function2 : 2 arguments en entrée, le resultat courant + lanouvelle valeur (reduction)FlatMapFunction : 1 argument en entrée, une liste de valeuren sortie (flatMap)
Spark: Exemple
JavaRDD<St r ing > l i n e s = sc . t e x t F i l e ( " data . t x t " ) ;JavaRDD<In teger > l ineLengths = l i n e s .map(new Funct ion <St r ing , In teger > ( ) {
p u b l i c I n tege r c a l l ( S t r i n g s ) { r e t u r n s . leng th ( ) ; }} ) ;i n t t o t a l Leng th = l ineLengths . reduce (new Function2 < In teger , In teger , In teger > ( ) {
p u b l i c I n tege r c a l l ( I n tege r a , I n tege r b ) { r e t u r n a + b ; }} ) ;
26 / 32
Spark
Certaines opérations travaillent avec des paires Clé-ValeurJavaPairRDD, PairFunction, Tuple2
Spark: Exemple
JavaRDD<St r ing > l i n e s = j s c . t e x t F i l e ( " JavaHdfsLR . java " ) ;JavaRDD<St r ing > words = l i n e s . f la tMap (
new FlatMapFunction <St r ing , S t r ing > ( ) {p u b l i c I t e r a b l e <St r ing > c a l l ( S t r i n g s ) {
r e t u r n Arrays . a s L i s t ( s . s p l i t ( " " ) ) ;}
}) ;JavaPairRDD<St r ing , In teger > ones = words . mapToPair (
new Pai rFunct ion <St r ing , S t r ing , In teger > ( ) {p u b l i c Tuple2 <St r ing , In teger > c a l l ( S t r i n g s ) {
r e t u r n new Tuple2 <St r ing , In teger >(s , 1 ) ;}
}) ;JavaPairRDD<St r ing , In teger > counts = ones . reduceByKey (
new Function2 < In teger , In teger , In teger > ( ) {p u b l i c I n tege r c a l l ( I n tege r i1 , I n tege r i 2 ) {
r e t u r n i 1 + i 2 ;}
}) ;
27 / 32
Spark
Variables partagées
Mise en place de variables auxquelles les différentsprocess en parallèle peuvent avoir accès
⇒ Très utile pour des tâches d’apprentissage statistique avecoptimisation itérative de paramètres
Deux types de variables partagéesVariables Broadcast: variable en lecture seule, partagée partous les processAccumulateurs: variable en écriture seule, à laquelle on nepeut qu’ajouter des éléments (seul le Driver peut lire lecontenu de la variable)
28 / 32
SparkDeux types de variables partagées
Variables Broadcast
Spark: Variables Broadcast
Broadcast < i n t [ ] > broadcastVar = sc . broadcast (new i n t [ ] {1 , 2 , 3 } ) ;broadcastVar . value ( ) ;
Accumulateurs
Spark: Accumulateurs
c lass VectorAccumulatorParam implements AccumulatorParam<Vector > {p u b l i c Vector zero ( Vector i n i t i a l V a l u e ) {
r e t u r n i n i t i a l V a l u e ;}p u b l i c Vector addInPlace ( Vector v1 , Vector v2 ) {
v1 . addInPlace ( v2 ) ; r e t u r n v1 ;}
}Vector i n i t i a l V a l u e =new Vector ( . . . ) ;Accumulator <Vector > vecAccum = sc . accumulator ( i n i t i a l V a l u e , new VectorAccumulatorParam ( ) ) ;/ / De n ’ importe quel process :vacAccum . add (new Vector ( . . . ) ) ;/ / Du d r i v e r :vacAccum . value ( ) ;
29 / 32
Spark
Exemple Spark: Regression Logistique
c lass ComputeGradient extends Funct ion <DataPoint , Vector > {p r i v a t e Vector w;ComputeGradient ( Vector w) { t h i s .w = w; }p u b l i c Vector c a l l ( DataPoint p ) {
r e t u r n p . x . t imes ( p . y − (1 / (1 + Math . exp(−w. dot ( p . x ) ) ) ) ) ;}
}
JavaRDD<DataPoint > po in t s = spark . t e x t F i l e ( . . . ) . map(new ParsePoint ( ) ) . cache ( ) ;Vector w = Vector . random (D) ; / / cu r ren t separa t ing planef o r ( i n t i = 0 ; i < ITERATIONS ; i ++) {
Vector g rad ien t = po in t s .map(new ComputeGradient (w ) ) . reduce (new AddVectors ( ) ) ;w = w. sub t rac t ( g rad ien t ) ;
}System . out . p r i n t l n ( " F i na l separa t ing plane : " + w) ;
30 / 32
Spark
31 / 32
Spark Streaming
32 / 32