Your SlideShare is downloading. ×

Dépasser map() et reduce()

1,069
views

Published on


0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,069
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
43
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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