Cloud Computing Année académique 2014/15 Qu'est-ce que le Big Data? Source: Paul Butler (Facebook) "Visualizing Friendships", https://www.facebook.com/note.php?note_id=469716398919 2 2015 Marcel Graf
Qu'est-ce que le Big Data? Source: Weldon Cooper Center for Public Service, http://demographics.coopercenter.org/dotmap/index.html 3 Qu'est-ce que le Big Data? Source: walkingsf on Flickr "Locals (blue) and tourists (red), photo locations Paris", http://www.flickr.com/photos/walkingsf/sets/72157624209158632/ 4
Qu'est-ce que le Big Data? Source: Strava biking trails heatmap, http://labs.strava.com/heatmap 5 Qu'est-ce que le Big Data? processes 20 PB a day (2008) crawls 20B web pages a day (2012) >10 PB data, 75B DB calls per day (6/2012) 150 PB on 50k+ servers running 15k apps (6/2011) Wayback Machine: 240B web pages archived, 5 PB (1/2013) >100 PB of user data + 500 TB/day (8/2012) LHC: ~15 PB a year S3: 449B objects, peak 290k request/second (7/2011) 1T objects (6/2012) 640K ought to be enough for anybody. LSST: 6-10 PB a year (~2015) SKA: 0.3 1.5 EB per year (~2020) 6
Qu'est-ce que le Big Data? On appelle "Big Data" des données qui sont trop larges, trop complexes et trop dynamiques pour les outils conventionnels à stocker, gérer et analyser. 7 Introduction est un modèle de programmation pour le traitement des données distribué. Sa puissance est dans sa capacité de évoluer à des centaines ou milliers de machines, qui peuvent avoir plusieurs coeurs. Quelle taille aurait une tâche de calcul? Données à l'échelle web : centaines de GB à TB ou PB Une copie du Web en 2012 (Common Crawl) a 3.8G documents et une taille de > 100TB. Google travaille en interne avec des tailles > 400TB. Les données ne peuvent pas être stockées sur le disque dur d'un seul ordinateur. Donc un système de fichiers distribué est nécessaire. 8
Distribution des données dans HDFS Quand on télécharge un grand fichier sur un cluster, le fichier est distribué sur les machines du cluster. Le système de fichiers s'occupe de diviser le fichier en morceaux (chunks de 64 Mo) qui sont pris en charge par différentes machines du cluster. C'est une forme de sharding. Un grand fichier Est coupé en morceaux Et les morceaux sont distribués sur les machines du cluster Noeud HDFS 1 Noeud HDFS 2 Noeud HDFS 3 Noeud HDFS 4 (En plus les chunks sont répliqués, il existe toujours trois copies dans le cluster.) 9 Traitement des données Concept principal On veut traiter un grand volume de données qui est réparti sur plusieurs machines. Approche traditionnelle : transporter les données vers le traitement Noeud 1 Noeud 2 Noeud 3 Noeud 4 Traitement Résultat Problème : Les volumes de données ne cessent de croître rapidement. Les disques durs ont une vitesse de lecture relativement faible (actuellement ~100 Mo/seconde) La lecture d'une copie du Web (> 400 To) nécessiterait plus d'un mois! 10
Traitement des données Concept principal Approche : transporter le traitement vers les données Chaque machine qui stocke des données exécute une partie du traitement. Les résultats partiels sont collectés et agrégés. Noeud 1 Résultat Noeud 2 Noeud 3 Noeud 4 partiel Avantages Moins de déplacement de données sur le réseau. Le traitement s'effectue en parallèle sur plusieurs machines. Résultat Effectuer un traitement sur une copie du Web en utilisant 1'000 machines : < 3 heures 11 Plateforme de calcul distribué Le concept est un modèle de traitement de données simple qui s'applique à beaucoup de problèmes : Google : calculer le PageRank qui détermine la pertinence d'une page web. Last.fm : calculer les charts des chansons les plus écoutées et recommandations (musique qui pourrait te plaire). Facebook : calculer des statistiques d'utilisation (croissance des utilisateurs, pages visitées, temps passé) et recommandations (gens que tu pourrais connaitre, applications qui pourraient te plaire). Rackspace : indexation des logs d'infrastructure pour la recherche d'erreur en cas de faille.... Pour le mettre en oeuvre il faut paralleliser les tâches de calcul équilibrer la charge optimiser les transferts disque et réseau gérer les cas où une machine tombe en panne... Il faut une plateforme de calcul distribué! 12
Hadoop Introduction Hadoop est un projet Open Source Apache une plateforme de calcul distribué un framework qui permet aux développeurs d'écrire des applications qui traitent un grand volume de données. Une installation Hadoop comporte principalement un cluster de machines (physiques ou virtuelles) le système de fichiers distribué HDFS (Hadoop Distributed File System) la base de données NoSQL HBase le système de calcul distribué les applications de traitement de données écrites par le développeur. Data analysis applications HBase database Hadoop Distributed File System (HDFS) A cluster of machines 13 Les fonctions Map et Reduce Origine des termes Les termes Map et Reduce viennent du langage Lisp Quand on a une liste on peut appliquer d'un coup la même fonction à chaque élément de la liste. On obtient une autre liste. P. ex. la fonction x x 2 On peut aussi appliquer d'un coup une fonction qui réduit tous les éléments d'une liste à une valeur. P. ex. la fonction de sommation Dans Hadoop, les fonctions Map et Reduce sont plus générales. liste d'entrée fonction Map liste de sortie liste d'entrée fonction Reduce 1 2 3 4 5 6 7 8 1 4 9 16 25 36 49 64 1 2 3 4 5 6 7 8 valeur de sortie 36 14
Exemple : Traitement de données météorologiques Le National Climatic Data Center des États Unis publie des données météorologiques Captées par des dizaines de milliers de stations météorologiques Mesures : température, humidité, précipitation, vent, visibilité, pression, etc. Données historiques disponibles depuis le début des mesures météorologiques Les données sont disponibles comme fichiers texte. Exemple de fichier : 0067011990999991950051507004+68750+023550FM- 12+038299999V0203301N00671220001CN9999999N9+00001+99999999999 0043011990999991950051512004+68750+023550FM- 12+038299999V0203201N00671220001CN9999999N9+00221+99999999999 0043011990999991950051518004+68750+023550FM- 12+038299999V0203201N00261220001CN9999999N9-00111+99999999999 0043012650999991949032412004+62300+010750FM- 12+048599999V0202701N00461220001CN0500001N9+01111+99999999999 0043012650999991949032418004+62300+010750FM- 12+048599999V0202701N00461220001CN0500001N9+00781+99999999999... 15 Exemple : Traitement de données météorologiques Chaque fichier contient les mesures d'une année. Une ligne représente un ensemble d'observations d'une station à un certain moment. Exemple de ligne commenté (réparti sur plusieurs lignes pour une meilleure lisibilité) : 0057 332130 # USAF weather station identifier 99999 # WBAN weather station identifier 19500101 # observation date 0300 # observation time 4 +51317 # latitude (degrees x 1000) +028783 # longitude (degrees x 1000) FM- 12 +0171 # elevation (meters) 99999 V020 320 # wind direction (degrees) 1 # quality code N 0072 1 00450 # sky ceiling height (meters) 1 # quality code C N 010000 # visibility distance (meters) 1 # quality code N 9-0128 # air temperature (degrees Celsius x 10) 1 # quality code - 0139 # dew point temperature (degrees Celsius x 10) 1 # quality code 10268 # atmospheric pressure (hectopascals x 10) 1 # quality code Source: Tom White, Hadoop: The Definitive Guide 16
Exemple : Traitement de données météorologiques Problème posé : On veut calculer pour chaque année la température maximale observée. Approche classique Script bash / awk #!/bin/bash for year in all/* do echo - ne $(basename $year.gz)"\t" gunzip - c $year \ awk '{ temp = substr($0, 88, 5) + 0; q = substr($0, 93, 1); %./max_temperature.sh if (temp!=9999 && q ~ /[01459]/ && temp > max) max = temp } 1901 317 END { print max }' 1902 244 done 1903 289 1904 256 1905 283... Temps de calcul pour les données de 1901 à 2000 : 42 minutes Source: Tom White, Hadoop: The Definitive Guide 17 Exemple : Traitement de données météorologiques Approche Le développeur écrit deux fonctions Le Mapper qui sera responsable d'extraire l'année et la température d'une ligne. Le Reducer qui sera responsable de calculer la température maximale. Hadoop se charge de Découper les fichiers d'entrée en morceaux, Instancier le Mapper sur chaque machine du cluster et d'exécuter les instances, Collecter les résultats des instances Mapper, Instancier le Reducer sur chaque machine du cluster et d'exécuter les instances en leur donnant les donnée produites par les instances Mapper, Stocker les résultats des instances Reducer. 106 0043011990999991950051512004...9999999N9+00221+99999999999... Mapper 1950 22 1950 0 22-11 Reducer 1950 22 18
0 0067011990999991950051507004...9999999N9+00001+99999999999... 106 0043011990999991950051512004...9999999N9+00221+99999999999... 212 0043011990999991950051518004...9999999N9-00111+99999999999... 318 0043012650999991949032412004...0500001N9+01111+99999999999... Les données météorologiques sont découpées en lignes. 424 0043012650999991949032418004...0500001N9+00781+99999999999... Mapper Mapper Mapper Mapper Mapper Le Mapper extrait l'année et la température et écrit une paire clévaleur (année, température) en sortie. 1950 0 1950 22 1950-11 1949 111 1949 78 Réorganisation et tri Les données intermédiaires sont regroupées par clé (l'année) et triées. 1949 111 78 1950 0 22-11 Reducer 1949 111 Reducer 1950 22 Le Reducer lit une année et toutes les températures de cette année. Il détermine le maximum et écrit une paire clé-valeur (année, température maximale) en sortie. Temps de calcul pour les données de 1901 à 2000 avec 10 machines : 6 minutes Exemple : Traitement de données météorologiques Le Mapper en Java import java.io.ioexception; import org.apache.hadoop.io.intwritable; import org.apache.hadoop.io.longwritable; import org.apache.hadoop.io.text; import org.apache.hadoop.mapreduce.mapper; public class MaxTemperatureMapper extends Mapper<LongWritable, Text, Text, IntWritable> { 20 private static final int MISSING = 9999; @Override public void map(longwritable key, Text value, Context context) throws IOException, InterruptedException { String line = value.tostring(); String year = line.substring(15, 19); int airtemperature; if (line.charat(87) == '+') { // parseint doesn't like leading plus signs airtemperature = Integer.parseInt(line.substring(88, 92)); } else { airtemperature = Integer.parseInt(line.substring(87, 92)); } String quality = line.substring(92, 93); if (airtemperature!= MISSING && quality.matches("[01459]")) { context.write(new Text(year), new IntWritable(airTemperature)); } } } Source: Tom White, Hadoop: The Definitive Guide entrée type clé entrée type valeur sortie type clé sortie type valeur entrée clé entrée valeur sortie écriture clé-valeur en sortie
Exemple : Traitement de données météorologiques Le Reducer en Java import java.io.ioexception; import org.apache.hadoop.io.intwritable; import org.apache.hadoop.io.text; import org.apache.hadoop.mapreduce.reducer; public class MaxTemperatureReducer extends Reducer<Text, IntWritable, Text, IntWritable> { @Override public void reduce(text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int maxvalue = Integer.MIN_VALUE; for (IntWritable value : values) { maxvalue = Math.max(maxValue, value.get()); } context.write(key, new IntWritable(maxValue)); } } entrée type clé entrée type valeur sortie type clé sortie type valeur entrée clé entrée valeurs sortie écriture clé-valeur en sortie Source: Tom White, Hadoop: The Definitive Guide 21 Exemple : Traitement de données météorologiques Le programme en Java import org.apache.hadoop.fs.path; import org.apache.hadoop.io.intwritable; import org.apache.hadoop.io.text; import org.apache.hadoop.mapreduce.job; import org.apache.hadoop.mapreduce.lib.input.fileinputformat; import org.apache.hadoop.mapreduce.lib.output.fileoutputformat; public class MaxTemperature { public static void main(string[] args) throws Exception { if (args.length!= 2) { System.err.println("Usage: MaxTemperature <input path> <output path>"); System.exit(- 1); } Job job = new Job(); job.setjarbyclass(maxtemperature.class); job.setjobname("max temperature"); répertoire des fichiers d'entrée répertoire des fichiers de sortie 22 FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); job.setmapperclass(maxtemperaturemapper.class); job.setreducerclass(maxtemperaturereducer.class); job.setoutputkeyclass(text.class); job.setoutputvalueclass(intwritable.class); System.exit(job.waitForCompletion(true)? 0 : 1); } } Source: Tom White, Hadoop: The Definitive Guide
Exemple : Comptage de mots William Shakespeare a écrit 38 pièces de théâtre, 154 sonnets, deux poèmes narratifs et autres vers. Chaque oeuvre est disponible comme fichier texte. Problème posé : compter la fréquence des mots de l'oeuvre shakespearienne. Approche Le développeur écrit deux fonctions Le Mapper qui sera responsable d'isoler les mots. Le Reducer qui sera responsable de compter les mots. 23 Exemple : Comptage de mots 32403 To be or not to be 56495 the last, not least Mapper Mapper to 1 be 1 or 1 the 1 last 1 Les documents d'entrée sont découpés en lignes. Le Mapper identifie les mots dans une ligne et pour chaque mot écrit en sortie une paire clé-valeur avec le mot comme clé et la valeur 1. not 1 to 1 be 1 not 1 least 1 Réorganisation et tri Les données intermédiaires sont regroupées par clé (le mot) et triées. be 1 1 last 1 least 1 not 1 1 or 1 the 1 to 1 1 Reducer Reducer Reducer Reducer Reducer Reducer Reducer be 2 last 1 least 1 not 2 or 1 the 1 to 2 Le Reducer lit un mot et toutes les occurrences du mot. Il additionne les occurrences et écrit en sortie une paire clévaleur avec le mot et ses occurrences. 24
Exercice 1 : Estimation de Pi Problème Utilisant la simulation Monte Carlo, déterminer la valeur de Pi Lancer des fléchettes 1 Calculer le rapport entre le nombre de fléchettes dans le cercle et le nombre de fléchettes dans le carré Déterminer si une fléchette se trouve à l'intérieur du cercle est facile -1 0 1-1 surface cercle = π surface carré = 4 π = 4 x surface cercle / surface carré 25 Exercice 1 : Estimation de Pi Solution 26
Exercice 2 : Lissage d'image Pour lisser une image utiliser un cache coulissant remplacer un pixel par la moyenne des 9 pixels dans le cache 27 Exercice 2 : Lissage d'image Solution 28
Flux de données détaillé 29 Source: Yahoo! Hadoop Tutorial Détails Fichiers d'entrée Les fichiers d'entrée contiennent les données pour un programme. Ils se trouvent généralement dans un système de fichiers distribué (HDFS, Amazon S3,...) Le format des fichiers d'entrée peut être arbitraire Fichiers logs en format texte Fichiers binaires Enregistrements sur plusieurs lignes... Ils peuvent être très larges, plusieurs dizaines de Go ou plus. 30
Détails InputFormat La manière dont les fichiers sont divisés en morceaux et lus sont définis par le InputFormat. InputFormat est une classe qui sélectionne les fichiers qui seront utilisés en entrée définit les InputSplits qui divisent un fichier fournit une factory pour des objets RecordReader qui vont lire le fichier. Hadoop vient avec un nombre de InputFormats prédéfinis InputFormat Description Clé Valeur TextInputFormat Format par défaut. Lit les lignes d'un fichier texte. L'offset en octets de la ligne dans le fichier. La ligne KeyValueInputFormat SequenceFileInputFormat 31 Analyse les lignes d'un fichier texte en paires clévaleur. Un format binaire à haute performance spécifique à Hadoop. Tout ce qui précède le premier caractère tab. Défini par l'utilisateur Le reste de la ligne Défini par l'utilisateur Détails InputSplit La classe InputSplit décrit une unité de travail qui correspond à une tâche Map dans un programme. Par défaut le InputFormat divise un fichier en splits de 64 Mo (ce qui correspond à la taille d'un chunk en HDFS). En divisant le fichier en splits, plusieurs tâches Map peuvent travailler en parallèle sur le même fichier. Si le fichier est très large, cela améliore la performance considérablement. Chaque tâche Map correspond à un seul split. 32
Détails RecordReader Le InputSplit définit un morceau de données à traiter mais ne spécifie pas comment y accéder. La classe RecordReader lit les données depuis leur source et les convertit en paires clé-valeur qui sont prêtes à être consommées par un Mapper. Le RecordReader est appelé à plusieurs reprises jusqu'à ce que le split entier soit consommé. Chaque invocation du RecordReader conduit à un autre appel de la fonction Map définie par le développeur. 33 Détails Mapper et Reducer Le Mapper exécute le traitement défini par l'utilisateur dans la première phase du programme. Une nouvelle instance du Mapper est créée pour chaque split. Le Reducer exécute le traitement défini par l'utilisateur dans la seconde phase du programme. Une nouvelle instance du Reducer est créée pour chaque partition. Pour chaque clé dans la partition, le Reducer est appelé une fois. 34
Détails Partitioner Après l'exécution des Mapper on a des résultats intermédiaires stockés sur chaque noeud du cluster, en format clé-valeur. Le framework doit maintenant préparer la prochaine phase de traitement par les Reducers. Les données doivent être transportées entre les noeuds, car les valeurs avec la même clé sont garanties d'être traitées par le même Reducer. Potentiellement on a un grand nombre de clés dans les données. On veut exécuter plusieurs Reducers en parallèle sur le cluster. Le développeur configure en avance le nombre d'instances de Reducers disponibles sur le cluster. Le framework divise l'espace des clés en partitions et attribue à chaque partition une instance Reducer. Chaque Mapper peut émettre des paires clé-valeur à n'importe quelle partition. Donc les noeuds doivent se mettre d'accord vers où envoyer les différentes pièces des données intermédiaires. La classe Partitioner détermine vers quelle partition une paire clé-valeur ira. Le Partitioner par défaut calcule une valeur de hash de la clé pour déterminer la partition. 35 Détails Tri Chaque Reducer est responsable de réduire un ensemble de paires clé-valeurs L'ensemble de paires clé-valeurs sur un noeud est automatiquement trié avant qu'il soit présenté au Reducer. Les valeurs par contre ne sont pas triées. 36
Détails OutputFormat La classe OutputFormat définit comment les paires clé-valeur produites par les Reducers sont écrites sur les fichiers de sortie. Il y a des OutputFormat fournis avec Hadoop qui écrivent des fichiers dans HDFS ou sur le disque local. Chaque Reducer écrit dans son propre fichier, mais dans un répertoire commun. Les OutputFormats prédéfinis fournis avec Hadoop : OutputFormat Description TextOutputFormat SequenceFileOutputFormat Format par défaut. Écrit une paire clé-valeur par ligne, les deux parties séparées par un caractère tab. Écrit des fichiers binaires qui peuvent être lus par des programmes subséquents. NullOutputFormat Ne produit pas de fichier de sortie. 37 Détails Optimisation de la phase Reduce avec le Combiner Pour certains traitements le développeur peut optimiser la phase Reduce avec le Combiner. Le Combiner est une sorte de Reducer supplémentaire écrit par le développeur. 38 Source: Yahoo! Hadoop Tutorial
Détails Optimisation de la phase Reduce avec le Combiner S'il est présent, le framework insère le Combiner dans la pipeline de traitement sur les noeuds qui viennent de terminer la phase Map. Le Combiner est exécuté après la phase Map, mais avant que les données intermédiaires sont envoyées vers d'autres noeuds. Le Combiner reçoit les données produites par la phase Map sur un noeud. Il reçoit seulement les données locales, pas celles des autres noeuds. Il produit des paires clé-valeur qui seront envoyées vers les Reducers. Le Combiner peut être utilisé dans les cas où on peut déjà commencer le Reduce sans avoir toutes les données. P. ex. le calcul de température maximale s'y prête très bien. Le Combiner calcule la température maximale pour les données disponibles sur le noeud local. Au lieu d'envoyer les paires (1949, 111) et (1949, 78) vers les Reducers on envoie seulement la paire (1949, 111). 39