Diese Präsentation wurde erfolgreich gemeldet.
Die SlideShare-Präsentation wird heruntergeladen. ×

Dépasser map() et reduce()

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Nächste SlideShare
Hadoop chez Kobojo
Hadoop chez Kobojo
Wird geladen in …3
×

Hier ansehen

1 von 18 Anzeige

Weitere Verwandte Inhalte

Diashows für Sie (20)

Andere mochten auch (20)

Anzeige

Ähnlich wie Dépasser map() et reduce() (20)

Weitere von HUG France (20)

Anzeige

Dépasser map() et reduce()

  1. 1. Ce support est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Pas de Modification 2.0 France. - http://creativecommons.org/licenses/by-nc-nd/2.0/fr/ HUG France #2 - 11 Avril 2012 Aller plus loin que map() et reduce() Ziad BIZRI ziad.bizri@ezako.com @BigDataEzako
  2. 2. Ce support est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Pas de Modification 2.0 France. - http://creativecommons.org/licenses/by-nc-nd/2.0/fr/ Pourquoi vous devez maîtriser MapReduce? • Parce que c’est la base technique de tout l’écosystème Hadoop (Hive, Pig, Cascalog) • Parce que c’est une façon différente de penser le code • Parce qu’on est des codeurs et qu’on n’a pas peur
  3. 3. Ce support est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Pas de Modification 2.0 France. - http://creativecommons.org/licenses/by-nc-nd/2.0/fr/ Running example « J’ai des fichiers de logs HTTP et je veux la liste des user agents qui viennent sur mon site » 123.123.123.123 - - [26/Apr/2000:00:23:48 -0400] "GET /pics/wpaper.gif HTTP/1.0" 200 6248 "http://www.jafsoft.com/asctortf/" "Mozilla/4.05 (Macintosh; I; PPC)" 123.123.123.123 - - [26/Apr/2000:00:23:47 -0400] "GET /asctortf/ HTTP/1.0" 200 8130 "http://search.netscape.com/Computers/Data_Formats/Document/Text/RTF" "Mozilla/4.05 (Macintosh; I; PPC)" 123.123.123.123 - - [26/Apr/2000:00:23:48 -0400] "GET /pics/5star2000.gif HTTP/1.0" 200 4005 "http://www.jafsoft.com/asctortf/" "Mozilla/4.05 (Macintosh; I; PPC)" 123.123.123.123 - - [26/Apr/2000:00:23:51 -0400] "GET /cgi- bin/newcount?jafsof3&width=4&font=digital&noshow HTTP/1.0" 200 36 “http://www.jafsoft.com/asctortf/” "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7"
  4. 4. Ce support est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Pas de Modification 2.0 France. - http://creativecommons.org/licenses/by-nc-nd/2.0/fr/ Mapper - simple public class UserAgentMapper implements Mapper<LongWritable, Text, Text, IntWritable> { private IntWritable one = new IntWritable(1); private Text outputKey = new Text(); private static String extractUserAgent(Text logEntry) {} @Override public void map(LongWritable key, Text logEntry, OutputCollector<Text, IntWritable> collector, Reporter reporter) throws IOException { outputKey.set(extractUserAgent(logEntry)); collector.collect(outputKey, one); } @Override public void configure(JobConf jobconf) {} @Override public void close() throws IOException {} }
  5. 5. Ce support est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Pas de Modification 2.0 France. - http://creativecommons.org/licenses/by-nc-nd/2.0/fr/ Les détails du mapper • configure(): - ouvrir une connexion - lire un fichier et le garder en mémoire - lire les paramètres passés dans la JobConf • close(): - idéal pour fermer une connexion - trop tard pour émettre des paires <clé, valeur> • reporter: - framework pour agréger des statistiques - contient des méthodes utilitaires
  6. 6. Ce support est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Pas de Modification 2.0 France. - http://creativecommons.org/licenses/by-nc-nd/2.0/fr/ Reducer - simple public class UserAgentReducer implements Reducer<Text, IntWritable, Text, IntWritable> { @Override public void reduce(Text key, Iterator<IntWritable> values, OutputCollector<Text, IntWritable> collector, Reporter reporter) throws IOException { int sum = 0; while (values.hasNext()) { sum += values.next().get(); } collector.collect(key, new IntWritable(sum)); } @Override public void configure(JobConf jobconf) {} @Override public void close() throws IOException {} }
  7. 7. Ce support est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Pas de Modification 2.0 France. - http://creativecommons.org/licenses/by-nc-nd/2.0/fr/ Exemple de base • Problème: beaucoup de paires <useragent, 1> en mémoire - risque de spooling sur le disque  coût d’exécution substantiel  Il faut utiliser un Combiner!
  8. 8. Ce support est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Pas de Modification 2.0 France. - http://creativecommons.org/licenses/by-nc-nd/2.0/fr/ Combiner - simple En entrée les paramètres de sortie du Mapper En sortie les paramètres d’entrée du Reducer public class UserAgentCombiner implements Reducer<Text, IntWritable, Text, IntWritable> { @Override public void reduce(Text key, Iterator<IntWritable> values, OutputCollector<Text, IntWritable> collector, Reporter reporter) throws IOException { int sum = 0; while (values.hasNext()) { sum += values.next().get(); } collector.collect(key, new IntWritable(sum)); }
  9. 9. Ce support est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Pas de Modification 2.0 France. - http://creativecommons.org/licenses/by-nc-nd/2.0/fr/ Besoin plus avancé « Je cherche tous les user agent uniques par adresse IP » – Approche 1: deux MapReduce, d’abord les user agent pour chaque utilisateur, puis les résultats uniques  Coûteux en temps d’exécution – Approche 2: dans le mapper sortir <useragent, ipaddress> puis utiliser un set dans le reducer pour dédupliquer  Le combiner devient plus complexe  Coûteux en RAM au niveau du reducer
  10. 10. Ce support est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Pas de Modification 2.0 France. - http://creativecommons.org/licenses/by-nc-nd/2.0/fr/ MapCopySortReduce?
  11. 11. Ce support est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Pas de Modification 2.0 France. - http://creativecommons.org/licenses/by-nc-nd/2.0/fr/ Sort Le tri est « gratuit » dans MapReduce – Partitioner • détermine l’instance du reducer pour une clé (fonction de hash) – Ouput Value Grouping Comparator • groupe les paires pour chaque appel de Reducer.reduce() – Output Key Comparator • trie les paires groupées pour l’iterator de reduce() Comment en tirer parti?
  12. 12. Ce support est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Pas de Modification 2.0 France. - http://creativecommons.org/licenses/by-nc-nd/2.0/fr/ Optimisations • Mapper: <user_agent####ip_address, ip_address> • On groupe les paires <user_agent####*> • Les groupes sont triés par le Output Key Comparator défaut • Reducer: compter le nombre de ip_address uniques • Combiner: réduire le nombre de user_agent####ip_address dupliqués
  13. 13. Ce support est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Pas de Modification 2.0 France. - http://creativecommons.org/licenses/by-nc-nd/2.0/fr/ Mapper - optimisé public class UserAgentMapper implements Mapper<LongWritable, Text, Text, Text> { private Text outputKey = new Text(); private Text outputValue = new Text(); private static String extractUserAgent(Text logEntry) {} private static String extractIpAddress(Text logEntry) {} @Override public void map(LongWritable key, Text logEntry, OutputCollector<Text, Text> collector, Reporter reporter) throws IOException { String ipaddress = extractIpAddress(logEntry); outputKey.set(extractUserAgent(logEntry) + "####" + ipaddress); outputValue.set(ipaddress); collector.collect(outputKey, outputValue); } }
  14. 14. Ce support est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Pas de Modification 2.0 France. - http://creativecommons.org/licenses/by-nc-nd/2.0/fr/ Combiner - optimisé public class UserAgentCombiner implements Reducer<Text, Text, Text, Text> { @Override public void reduce(Text key, Iterator<Text> values, OutputCollector<Text, Text> collector, Reporter reporter) throws IOException { collector.collect(key, values.next()); } }
  15. 15. Ce support est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Pas de Modification 2.0 France. - http://creativecommons.org/licenses/by-nc-nd/2.0/fr/ Sort - optimisé public class UserAgentPartitioner implements Partitioner<Text, Text> { @Override public int getPartition(Text key, Text value, int numPartitions) { String keyString = key.toString(); int position = keyString.indexOf("####"); return keyString.substring(0, position).hashCode() % numPartitions; } } public class UserAgentGroupingComparator implements RawComparator<Text> { @Override public int compare(Text o1, Text o2) { String o1String = o1.toString(); String o2String = o2.toString(); String key1 = o1String.substring(0, o1String.indexOf("####")); String key2 = o2String.substring(0, o2String.indexOf("####")); return key1.compareTo(key2); } @Override public int compare(byte[] o1, int o1Start, int o1Length, byte[] o2, int o2Start, int o2Length) { return compare(new Text(o1), new Text(o2)); } }
  16. 16. Ce support est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Pas de Modification 2.0 France. - http://creativecommons.org/licenses/by-nc-nd/2.0/fr/ Reducer - optimisé public class UserAgentReducer implements Reducer<Text, Text, Text, IntWritable> { @Override public void reduce(Text key, Iterator<Text> values, OutputCollector<Text, IntWritable> collector, Reporter reporter) throws IOException { String lastIp = null; int sum = 0; while (values.hasNext()) { String currentIp = values.next().toString(); if (lastIp == null) { lastIp = currentIp; sum += 1; } else if (lastIp.equals(currentIp)) { // Do nothing } else { sum += 1; } } String keyString = key.toString(); collector.collect(new Text(keyString.substring(0, keyString.indexOf("####"))), new IntWritable(sum)); } }
  17. 17. Ce support est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Pas de Modification 2.0 France. - http://creativecommons.org/licenses/by-nc-nd/2.0/fr/ Questions? Mapper Reducer Shuffler Partitioner Copy Reporter Configure Sort Combiner Join MultipleInputs Collector
  18. 18. Ce support est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Pas de Modification 2.0 France. - http://creativecommons.org/licenses/by-nc-nd/2.0/fr/ HUG France #2 - 11 Avril 2012 Aller plus loin que map() et reduce() Merci pour votre attention Ziad BIZRI ziad.bizri@ezako.com @BigDataEzako

×