16/03/2015. Diviser pour calculer plus vite Fork - Join. Quelques modèles en programmacon parallèle et leur mise en œuvre en Java.



Documents pareils
Introduction à MapReduce/Hadoop et Spark

MapReduce. Malo Jaffré, Pablo Rauzy. 16 avril 2010 ENS. Malo Jaffré, Pablo Rauzy (ENS) MapReduce 16 avril / 15

Synchro et Threads Java TM

4. Outils pour la synchronisation F. Boyer, Laboratoire Lig

Threads. Threads. USTL routier 1

Certificat Big Data - Master MAthématiques

Map-Reduce : un cadre de programmation parallèlle pour l analyse de grandes données. Stéphane Genaud ENSIIE

API04 Contribution. Apache Hadoop: Présentation et application dans le domaine des Data Warehouses. Introduction. Architecture

Info0604 Programmation multi-threadée. Cours 5. Programmation multi-threadée en Java

Introduction : les processus. Introduction : les threads. Plan

J2SE Threads, 1ère partie Principe Cycle de vie Création Synchronisation

Notion de thread (1/2)

Instructions pour mettre à jour un HFFv2 v1.x.yy v2.0.00

Programmation parallèle et distribuée (Master 1 Info )

Java avancé Objectifs. version support 1.2

Un ordonnanceur stupide

Big Data. Cyril Amsellem Consultant avant-vente. 16 juin Talend

Auto-évaluation Programmation en Java

MapReduce et Hadoop. Alexandre Denis Inria Bordeaux Sud-Ouest France ENSEIRB PG306

Remote Method Invocation Les classes implémentant Serializable

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.

TD2 Programmation concurrentielle

INITIATION AU LANGAGE JAVA

Once the installation is complete, you can delete the temporary Zip files..

Une introduction à la technologie EJB (2/3)

Notes de cours Practical BigData

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Application Form/ Formulaire de demande

Cartographie des solutions BigData

Génération de code binaire pour application multimedia : une approche au vol

1-Introduction 2. 2-Installation de JBPM 3. 2-JBPM en action.7

Utiliser une WebCam. Micro-ordinateurs, informations, idées, trucs et astuces

Exercices sur SQL server 2000

Alfstore workflow framework Spécification technique

Projet de programmation (IK3) : TP n 1 Correction

4. Outils pour la synchronisation F. Boyer, Laboratoire Sardes

Differential Synchronization

Organiser vos données - Big Data. Patrick Millart Senior Sales Consultant

4 Exemples de problèmes MapReduce incrémentaux

Programmation Par Objets

M2-Images. Rendu Temps Réel - OpenGL 4 et compute shaders. J.C. Iehl. December 18, 2013

Supervision et infrastructure - Accès aux applications JAVA. Document FAQ. Page: 1 / 9 Dernière mise à jour: 15/04/12 16:14

APPENDIX 6 BONUS RING FORMAT

ACTIVITÉ DE PROGRAMMATION

Implémentation parallèle de certains algorithmes de fouille de données avec le framework MapReduce

Introduc)on à Map- Reduce. Vincent Leroy

Plan du cours. Historique du langage Nouveautés de Java 7

WEB page builder and server for SCADA applications usable from a WEB navigator

SugarCubes. Jean-Ferdinand Susini Maître de Conférences, CNAM Chaire systèmes enfouis et embarqués. Paris, le 9 janvier, 2009

BIG Data et R: opportunités et perspectives

MapReduce. Nicolas Dugué M2 MIAGE Systèmes d information répartis

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

Contents Windows

Tutoriel: Création d'un Web service en C++ avec WebContentC++Framework

Calcul Parallèle. Cours 5 - JAVA RMI

Hadoop, Spark & Big Data 2.0. Exploiter une grappe de calcul pour des problème des données massives

Programmer en JAVA. par Tama

Introduction à la programmation concurrente

Practice Direction. Class Proceedings

NFP 121. Java et les Threads. Présentation : Thierry Escalarasse Mai 2007

3615 SELFIE. HOW-TO / GUIDE D'UTILISATION

Instructions Mozilla Thunderbird Page 1

Fouillez facilement dans votre système Big Data. Olivier TAVARD

Quick Start Guide This guide is intended to get you started with Rational ClearCase or Rational ClearCase MultiSite.

calls.paris-neuroscience.fr Tutoriel pour Candidatures en ligne *** Online Applications Tutorial

Guide d'installation rapide TFM-560X YO.13


Exercices INF5171 : série #3 (Automne 2012)

Dis papa, c est quoi un bus logiciel réparti?

École Polytechnique de Montréal. Département de Génie Informatique et Génie Logiciel. Cours INF2610. Contrôle périodique.

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

NoSQL. Introduction 1/23. I NoSQL : Not Only SQL, ce n est pas du relationnel, et le contexte. I table d associations - Map - de couples (clef,valeur)

Surveillance de Scripts LUA et de réception d EVENT. avec LoriotPro Extended & Broadcast Edition

Plan. Department of Informatics

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

1.The pronouns me, te, nous, and vous are object pronouns.

Vanilla : Virtual Box

DOCUMENTATION - FRANCAIS... 2

Règles et paramètres d'exploitation de Caparmor 2 au 11/12/2009. Pôle de Calcul Intensif pour la mer, 11 Decembre 2009

Confirmation du titulaire de la carte en cas de contestation de transaction(s) Cardholder s Certification of Disputed Transactions

Conception des systèmes répartis

Par Laurent DESECHALLIERS. Mastère Spécialisé en Management de Projets en Milieu Industriel. CESI de Rouen Promotion 2002/2003.

Développement Logiciel

Apprendre la Programmation Orientée Objet avec le langage Java (avec exercices pratiques et corrigés)

Programmation d Applications Concurrentes et Distribuées (INF431)

Our experience in using Apache Giraph for computing the diameter of large graphs. Paul Bertot - Flavian Jacquot

Compléter le formulaire «Demande de participation» et l envoyer aux bureaux de SGC* à l adresse suivante :

Android et le Cloud Computing

JSIam Introduction talk. Philippe Gradt. Grenoble, March 6th 2015

PARIS ROISSY CHARLES DE GAULLE

2013 IIHF WORLD WOMEN S HOCKEY CHAMPIONSHIP

4. SERVICES WEB REST 46

OpenPaaS Le réseau social d'entreprise

Utilisation de JAVA coté Application serveur couplé avec Oracle Forms Hafed Benteftifa Novembre 2008

Programmation parallèle et distribuée

Environnements de développement (intégrés)

Forthcoming Database

Transcription:

Diviser pour calculer plus vite Fork - Join riveill@unice.fr h5p://www.i3s.unice.fr/~riveill Quelques modèles en programmacon parallèle et leur mise en œuvre en Java 2 SituaCon 1 Synchroniser un ensemble de thread : la barrière Il existe de nombreux problèmes organisés de la manière suivante : Idée : tous les processus franchissent au même moment la barrière données Calcul données Calcul données Calcul Implémenta-on : Facile à implémenter par un moniteur ou avec des sémaphores a été introduit dans Java 7 SynchronisaCon et échange des données Principe en Java 7 : Un processus crée un objet barrière il donne le nombre N de processus a5endu Les données peuvent être idencques ou non Les calcul peuvent être idencque ou non, l important c est qu ils s effectuent sur des données indépendantes 3 Chaque processus exécute «await» sur l objet barrière Quand N est a5eint, la barrière s ouvre 4 1

La barrière La barrière public class MonRunnable implements Runnable { private CyclicBarrier barrier; string name = Thread.currentThread().getName(); public MonRunnable(CyclicBarrier barrier) { this.barrier = barrier; main(string args[]) { //creating CyclicBarrier with 3 Threads needs to call await() CyclicBarrier cb = new CyclicBarrier(3, new Runnable(){ public void run(){ //This task will be executed once all thread reaches barrier System.out.println("All parties are arrived at barrier"); ); public void run() { System.out.println(threadName + " is started"); Thread.sleep(400*new Random().nextInt(10)); System.out.println(threadName + " is waiting on barrier"); barrier.await(); System.out.println(threadName + " has crossed the barrier"); 5 //starting each of thread Thread t1 = new Thread(new MonRunnable(cb), "Thread 1"); Thread t2 = new Thread(new MonRunnable(cb), "Thread 2"); Thread t3 = new Thread(new MonRunnable(cb), "Thread 3"); System.out.println("Début démarrage des threads"); t1.start(); t2.start(); t3.start(); System.out.println("Fin démarrage des threads"); 6 La barrière La barrière en Java Un exemple d exécucon Début démarrage des threads Fin démarrage des threads Thread 3 is started Thread 1 is started Thread 2 is started Thread 1 is waiting on barrier Thread 2 is waiting on barrier Thread 3 is waiting on barrier All parties are arrived at barrier, lets play Thread 3 has crossed the barrier Thread 2 has crossed the barrier Thread 1 has crossed the barrier Evidemment dans la cas de tâches cycliques, il faut réinicaliser la barrière reset() 7 Class Barrier { private final int N_THREADS; int arrived; public Barrier (int n) { N_THREADS = n; public synchronized void await () { arrived++; if (arrived < N_THREADS) { wait(); else { arrived = 0; notifyall(); Sans un phénomène bien curieux appelé à Spurious wakeup 8 2

Spurious wakeup h6p://docs.oracle.com/javase/7/docs/api/java/lang/object.html A thread can also wake up without being nocfied, interrupted, or Cming out, a so- called spurious wakeup. While this will rarely occur in praccce, applicacons must guard against it by tescng for the condicon that should have caused the thread to be awakened, and concnuing to wait if the condicon is not sacsfied. In other words, waits should always occur in loops, like this one: Arrive en parcculier sur synchronized (obj) { Linux car mise en œuvre while (<condition does not hold>) de la JVM avec les pthread qui me5ent en obj.wait(timeout); gardent contre les... // Perform action «Spurius wakeup» For more informacon on this topic, see SecCon 3.2.3 in Doug Lea's "Concurrent Programming in Java (Second EdiCon)" (Addison- Wesley, 2000), or Item 50 in Joshua Bloch's "EffecCve Java Programming Language Guide" (Addison- Wesley, 2001). 9 La barrière en Java Class Barrier { private final int N_THREADS; int[] counts = new int[] {0, 0; int current = 0; public Barrier (int n) { N_THREADS = n; Prise en compte du Spurious wakeup public synchronized void await () { int my = current; counts[my]++; if (counts[my] < N_THREADS) while (counts[my] < N_THREADS) wait(); else { current ^= 1; counts[current] = 0; notifyall(); 10 SituaCon 2 ProposiCon de solucon Il existe de nombreux problèmes qui peuvent être décomposé en sous- problèmes indépendants et qui sont donc facilement parallélisables Principe On crée autant de thread que de problème à résoudre (fork) La thread principale a5end la terminaison des différents calculs (join) Pa5ern de calcul fork- join Principe de mise en œuvre CréaCon d autant de tâches que de sous- problèmes ExécuCon en parallèle de toutes ces tâches A5ente de la fin de toutes les tâches (barrière) Java moniteur Class { int i; Synchronized a5endre (int N) { i := N; wait (); // appel thread principale Synchronized fini () { i- - ; if (i<=0) nocfy (); // appel des N thread filles Java semaphore for (i:=0; i++; i<n) s.down(); s.up (); Fusion des résultats parcels // appel thread principale // appel des N thread filles 11 Depuis Java 7 il est possible de traiter ce cas directement avec le modèle fork- join 12 3

Cas d uclisacon du modèle Fork / Join Lorsque le traitement est décomposable en sous- tâches indépendantes Existence d'algorithmes parallèles spécifiques La décomposicon en sous- tâches peut être : stacque : découper un tableau en zones fixes dynamique : découvrir une arborescence de fichiers A5enCon à maîtriser le volume de tâches créées récursive Problème 1 : contrôler le nombre de thread en accvité 14 Contrôle du parallélisme Pool de thread Le parallélisme c est bien mieux si on peut effec-vement calculer en parallèle ExploitaCon d une l architecture mulc- cœur Java Nom du thread courant : Thread.currentThread().getName() Nombre de cœur sur le processeur : Thread.currentThread().getName() Quel est l intérêt de lancer 10 thread si on a que 4 cœurs? Jusqu à présent on créait des threads parallèles sans jamais se poser la quescon du nombre de threads qui était effeccvement exécuté en // Un modèle : les «pools» de thread Créer une thread coûte cher Alors on recycle J Principe On crée un ensemble de N threads Généralement moins que de processeurs/coeurs existants Ou au contraire légèrement plus pour prendre en compte les opéracons bloquantes (entrée/sorce, réseau) On crée un ensemble de tâche Le nombre dépend généralement du problème à résoudre Les tâches sont successivement exécutées par les thread Mise en œuvre en Java à l aide d une nouvelle hiérarchie : Executor 15 16 4

Classe Executors une autre manière d accver une thread Classe Executors : exécucon séquencelle des tâches public class MonRunnable implements Runnable { public void run(){ System.out.println("Debut execution dans le thread " +Thread.currentThread().getName()); //On simule un traitement long Thread.sleep(4000); System.out.println("Fin execution dans le thread " +Thread.currentThread().getName()); SoluCon déjà connue Thread thread = new Thread(new MonRunnable()); thread.start(); En uclisant l interface Executor Executor executor = Executors.newSingleThreadExecutor(); executor.execute(new MonRunnable()); 17 List<Runnable> runnables = new ArrayList<Runnable>(); //création de 4 tâches //création executor mono-thread ExecutorService executor = Executors.newSingleThreadExecutor(); //exécution des tâches selon le modèle choisi for(runnable r : runnables){ executor.execute(r); //attente de la terminaison de toutes les tâches executor.shutdown(); 18 Classe Executors : exécucon séquencelle des tâches Classe Executors : exécucon séquencelle des tâches B A C B A Serveur CPU Le CPU est inaccf pendant les E/S Evidemment les traces d exécucon sont : Debut execution dans le thread pool-1-thread-1 Fin execution dans le thread pool-1-thread-1 Debut execution dans le thread pool-1-thread-1 Fin execution dans le thread pool-1-thread-1 Debut execution dans le thread pool-1-thread-1 Fin execution dans le thread pool-1-thread-1 Debut execution dans le thread pool-1-thread-1 Fin execution dans le thread pool-1-thread-1 C File contenant les requêtes en a5ente Avantage Facile à ucliser 19 20 5

Classe Executors : exécucon parallèle des tâches Classe Executors : exécucon parallèle des tâches List<Runnable> runnables = new ArrayList<Runnable>(); //création de 4 tâches Seul changement A A CPU Serveur B CPU Un nombre opcmum de thread peut être créé et recyclé //création executor pool de 2 threads ExecutorService executor = Executors.newFixedThreadPool(2); //Executors.newSingleThreadExecutor(); //exécution des taches selon le modèle choisi for(runnable r : runnables){ executor.execute(r); //attente de la terminaison de toutes les taches executor.shutdown(); 21 B C C Avantage Moins de requête dans la file d a5ente Minimize la créacon /destruccon de thread Désavantage Nécessité de «tunning» pour Crer le meilleur parc du matériel Pas facile à me5re en œuvre avant Java 7.0 22 Classe Executors : exécucon parallèle des tâches Un exemple d exécucon des threads Debut execution dans le thread pool-1-thread-1 Debut execution dans le thread pool-1-thread-2 Fin execution dans le thread pool-1-thread-2 Fin execution dans le thread pool-1-thread-1 Debut execution dans le thread pool-1-thread-2 Debut execution dans le thread pool-1-thread-1 Fin execution dans le thread pool-1-thread-1 Fin execution dans le thread pool-1-thread-2 Problème 2 : lancer un calcul et récupérer plus tard son résultat 23 24 6

Un modèle : l appel asynchrone avec avec future Runnable versus Callable<T> Appel synchrone appelant client appelé serveur Appel asynchrone avec futur appelant client appelé serveur futur Runnable Introduced in Java 1.0 Callable<T> Introduced in Java 1.5 as part of java.ucl.concurrent library execute() submit() new() Runnable cannot be parametrized Callable is a parametrized type whose type parameter indicates the return type of its run method returns() Appel de méthode Appel de procédure à distance (RPC) Client- serveur get() returns() put() Acteurs / objets accfs Appel aynchrone de procédure à distance (A- RPC) 25 Classes implemencng Runnable needs to implement run() method Runnable.run() returns no Value Can not throw Checked ExcepCons publicinterfacerunnable { void run(); Classes implemencng Callable needs to implement call() method Callable.call() returns a value of Type T Can throw Checked ExcepCons publicinterfacecallable<v>{ V call() throwsexception; 26 Classe Callable La classe Future<T> public class MonCallable implements Callable<Integer> { public Integer call() { System.out.println("Debut execution ); //Simulation traitement long Thread.sleep(4000); System.out.println("Fin execution); return new Random().nextInt(10); // création d un Executor ExecutorService executor = Executors.newSingleThreadExecutor(); //Appel de la tache et récupération d un Future<V> Future<Integer> future = executor.submit(new MonCallable()); System.out.println("Apres submit"); //On a besoin du résultat on appel : future.get() // appel bloquant System.out.println("Resultat=" + future.get()); System.out.println("Avant shutdown"); execute.shutdown(); 27 28 7

Appel asynchrone avec futur Exemple de trace Apres submit Debut execution Fin execution Resultat=6 Avant shutdown Mise en oeuvre du modèle fork- join en Java 29 30 Mise en oeuvre du pa5ern forkjoin en Java Algorithme Exemple Cré de : h5p://fr.openclassrooms.com/informacque/cours/apprenez- a- programmer- en- java/depuis- java- 7- le- pa5ern- fork- join Le problème Parcourir tous les répertoires de mon $HOME et afficher le nombre de fichier contenant le suffixe psd Se décompose assez aisément en sous- problèmes indépen- dants L analyse d un répertoire peut être réalisé de manière récur- sive par analyse des sous ré- pertoire Dans chaque répertoire : On lance une nouvelle analyse pour chaque sous- répertoires On compte le nombre de fichier correspondant au filtre On a5end la terminaison des analyses des sous répertoires et on addiconne le nombre de fichier trouvé 31 32 8

Le pa5ern forkjoin Approche séquencelle Il y a 92 fichier(s) portant l'extension *.psd Temps de traitement : 67723 UClisaCon de 4 coeurs Il y a 92 fichier(s) portant l'extension *.psd Temps de traitement : 78679 Mais temps d a5ente presque 3 fois plus cours ForkJoinPool : représente un pool de thread qui reçoit la liste des tâches à réaliser invoque : lance les tâches passées en paramètre de manière synchrones execute : lance les tâches passées en paramètre de manière asynchrones submit : lance la tâche passée en paramètre de manière asynchrone et renvoie un objet futur immédiatement ForkJoinTask : représente une tâche unique invoke(): exécucon de la tâche par la thread courante fork(): lance une autre tâche dans le même pool que la thread courante join(): retourne le résultat de l exécucon de ce5e tâche Un ForkJoinPool exécute des ForkJoinTasks <interface> Executor <interface> ExecutorService ForkJoinPool <interface> Future<V> <abstract> ForkJoinTask<V> T invoke(task) void execute(task) Future<T> submit(task) RecursiveTask<V> RecursiveAction compute(), invoke(), fork(), join(), isdone(), get()... 33 34 ForkJoinTask Main RecursiveAction Implémente Future<Void> Modélise un traitement qui ne renvoie pas de valeur Peut néanmoins modifier les données passées en paramètre Ex : trier un tableau "in- place" RecursiveTask<V> Implémente Future<V> Modélise un traitement récursif qui renvoie une valeur Ex : calculer la taille totale d'une arborescence de fichiers // Nombre de processeurs disponibles int processeurs = RunCme.getRunCme().availableProcessors(); // CréaCon du pool de thread ForkJoinPool pool = new ForkJoinPool(processeurs); compute() est la méthode excécutée par la tâche équivalent à run() pour les thread Les tâches peuvent être appelées de manière synchrone ou asynchrone Synchrone : invoke() Asynchrone : fork() // CréaCon de l'objet FolderScanner FolderScanner fs = new FolderScanner(chemin, filtre); // Analyse resultat = fs.sequencalscan(); // Un transparent qui suit décrit : // sequencalscan // CréaCon de l'objet FolderScanner RecursiveTask<Long> fs = new FolderScanner(chemin, filtre); // Analyse resultat = pool.invoke(fs); // exécute compute // Un transparent qui suit décrit : // compute 36 9

Synchrone ou Asynchrone? (ForkJoinPool) FolderScanner Resultat = pool.invoke(fs); est équivalent à : pool.invoke(fs); Bla bla bla resultat = fs.join(); Resultat = pool.execute(fs); est équivalent à : pool.execute(fs); Bla bla bla resultat = fs.join(); public class FolderScanner { public long sequencalscan() { // RécupéraCon de la liste des fichiers du répertoire d analyse DirectoryStream<Path> liscng = Files.newDirectoryStream(path)); for (Path nom : liscng) { if (Files.isDirectory(nom.toAbsolutePath())) { // S'il s'agit d'un dossier il est analysé result += new FolderScanner( nom.toabsolutepath(), this.filter).sequencalscan(); // RécupéraCon de la liste des fichiers répondant au filtre DirectoryStream<Path> liscng = Files.newDirectoryStream(path, this.filter)); for (Path nom : liscng){ // Pour chaque fichier, on incrémente le compteur result++; public class FolderScanner extends RecursiveTask<Long> public Long compute() { // RécupéraCon de la liste des fichiers du répertoire d analyse DirectoryStream<Path> liscng = Files.newDirectoryStream(path)); for (Path nom : liscng) { if (Files.isDirectory(nom.toAbsolutePath())) { // S'il s'agit d'un dossier il est analysé subtasks.add(new FolderScanner( nom.toabsolutepath(), this.filter).fork()); // RécupéraCon de la liste des fichiers répondant au filtre DirectoryStream<Path> liscng = Files.newDirectoryStream(path, this.filter)); for (Path nom : liscng) { // Pour chaque fichier, on incrémente le compteur result++; // RécupéraCon du résultat de toutes les sous- tâches for (ForkJoinTask<Long> subtask : subtasks) result += subtask.join(); 37 return result; return result; 38 Synchrone ou asynchrone? (ForkJoinTask/RecursiveTask/RecursiveAcCon) Asynchronisme et tâches récursives (RecursiveTask) if (Files.isDirectory(nom.toAbsolutePath())) { // S'il s'agit d'un dossier il est analysé ForkJoinTask<Long> fs = new FolderScanner( nom.toabsolutepath(), this.filter).invoke(); if (Files.isDirectory(nom.toAbsolutePath())) { // S'il s'agit d'un dossier il est analysé ForkJoinTask<Long> fs = new FolderScanner( nom.toabsolutepath(), this.filter).fork(); // correct protected Long compute() { List<ForkJoinTask<Long>> subtasks = new ArrayList<>(); long size = 0; // Incorrect protected Long compute() { ForkJoinTask<Long> subtask; long size = 0; fs.invoke(); Bla bla bla fs.join(); fs.fork(); Bla bla bla fs.join(); 39 for(file f : root.listfiles()) { if (f.isdirectory()) { subtasks.add(new Task(f).fork()); else { size += f.length(); for (ForkJoinTask<Long> subtask : subtasks) { size += subtask.join(); return size; for (File f : root.listfiles()) { if (f.isdirectory()) { subtask = new Task(f).fork(); size += subtask.join(); else { size += f.length(); return size; /* l asynchronisme souhaité (fork) n est pas exploité : on a5end tout de suite */ 10

Bonnes pracques OpCmisaCons A5enCon au coût de gescon Le bénéfice obtenu en parallélisant un traitement doit être supérieur au coût de gescon par le framework Trouver la bonne granularité A5enCon à la consommacon mémoire Grosses structures : préférer la modificacon "in- place" Découverte dynamique des sous- tâches A5enCon à la complexité OpCmisaCon prématurée? Maintenance Framework Fork / Join Threads >= Degré de parallélisme Les tâches en a5ente de join() sont mises de côté pour perme5re à d'autres tâches d'être traitées Tâches Eviter la synchronisacon manuelle UCliser fork() et join() uniquement OpCmiser la granularité à l'aide des stacscques du pool getqueuedsubmissioncount(), getstealcount()... Possibilité d'opcmisacon dynamique Quelques références qui m ont aidées pour préparer ce cours API Java 7, package java.ucl.concurrent h5p://download.java.net/jdk7/docs/api/ Etude de Doug Lea h5p://gee.cs.oswego.edu/dl/papers/ˆ.pdf Des blogs/tutoriaux h5p://www.oracle.com/technetwork/arccles/java/fork- join- 422606.html h5p://blog.paumard.org/2011/07/05/java- 7- fork- join/ h5p://sdz.tdct.org/sdz/le- framework- executor.html h5p://fr.openclassrooms.com/informacque/cours/apprenez- a- programmer- en- java/depuis- java- 7- le- pa5ern- fork- join Un modèle proche mais complémentaire Map Reduce Sera présenté en détail dans certains parcours de 5ème année 44 11

Map Reduce Exemple Modèle de programmacon très contraint qui permet Une parallélisacon automacque De l équilibrage de charge Des opcmisacons sur les transferts disques et réseaux De la tolérance aux pannes 1. Lecture des données 2. Map A chaque élément du flux repéré par une clé K1, Map associe un liste de couple <clé, valeur> Map: <K1, V1> à list (K2, V2) 3. Shuffle/Sort : regrouper les sorces et les trier selon les clés K2 4. Reduce Exécuté une fois la phase Map terminée AgrégaCon en liste de toutes les valeurs intermédiaires associées à une clé K2 AgrégaCon est une opéracon associacve Reduce: <K2, list(v2) > à list (K3, V3) bien souvent : K2 = K3 5. Ecrire les données 45 Parmis un ensemble de texte, compter les occurrences de chaque mot 1. Données : ensemble de fichier 2. Map Sur chaque texte, décomposer en mots, et à chaque mot m, ajouter à la liste des couples émis le couple (m, 1) 3. Shuffle/Sort Le système regroupe toutes les couples émis et les regroupes selon la clé m (a,1), (b,1), (c, 1), (b, 1), (a, 1), à (a, 1, 1), (b, 1, 1), (c, 1), 4. Reduce Les valeurs 1 sont addiconnées pour chaque mot (a, 1, 1), (b, 1, 1), (c, 1), à (a, 2), (b, 2), (c, 1) 46 Exemple : Compter l occurrence de chaque mots dans un ensemble de fichiers Exemple (suite) Map Map: <K1, V1> à list (K2, V2) Exemple: K1 = nom du fichier, permet d associer chaque fichier à un noeud qui va traiter la fonccon Map V1 = contenu du fichier K2 = mot V2 = 1 (présence d une occurrence) Orange Poire Orange Poire Orange Map <, 1> <Orange, 1> <Poire, 1> <, 1> <, 1> <Orange, 1> <Poire, 1> <Orange, 1> Reduce <K2, list(v2) > à list (K3, V3) bien souvent : K2 = K3 Exemple: K2 = mot, permet d associé un mot à un noeud qui va traiter la fonccon reduce V2 = 1 (présence d une occurrence) K3 = K2 V3 = N (nbre d occurrence détectée) La fonccon d aggrégacon est la somme, elle est bien associacve <, 1, 1, 1> <Orange, 1, 1, 1> Reduce Reduce <, 3> <Orange, 3> Map 47 <Poire, 1, 1> Reduce <Poire, 2> 48 12

Exemple Orange Orange Poire Poire Orange S P L I T Orange Poire Orange Poire Orange Map Map <Orange, 3> <Poire, 2> <, 1> <Orange, 1> <Poire, 1> <, 1> <, 1> <Orange, 1> <Poire, 1> <Orange, 1> S H U F F L E / S O R T <Orange, 1, 1, 1> <Poire, 1, 1> <, 1, 1, 1> Reduce Reduce Exemple (Mise en oeuvre) L uclisateur programme les fonccons Map / Reduce En pseudo Java Map(String input_key, String input_value) { foreach word w in input_value do { EmitIntermediate (w, 1); Reduce (String key, Iterator<Integer> intermediate_value) { int result =0; foreach v in intermediate_value do { result += v; Le framework fourni les fonccons SPLIT / SORT mais aussi la gescon du flux de données <, 3> Reduce 49 50 ForkJoin versus MapReduce ForkJoin Single machine Takes advantage of mulcple cores ForkJoin recursively parccons a task into several subtasks, on a single machine Starts quickly and scales well for small inputs (<5MB), but it cannot process larger inputs due to the size restriccons of shared- memory, single node architectures. No fault tolerance No distribucon Exist in Java since Java 7 MapReduce Cluster machine Take advantages of cluster machine. Massively scalable. Does only one big split, with no communicacon between the parts uncl the reduce step. MapReduce takes tens of seconds to start up, but scales well for much larger inputs (>100MB) on a compute cluster. Generally, fault tolerant implementacon, transparent task distribucon Exist since 2004 Popularized by google Open source implementacon: hadoop (h5p://hadoop.apache.org/) 51 Q&A h5p://www.i3s.unice.fr/~riveill 53 13