• Like

Loading…

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

Dépasser map() et reduce()

  • 1,007 views
Uploaded on

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
1,007
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
36
Comments
0
Likes
0

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. HUG France #2 - 11 Avril 2012 Aller plus loin que map() et reduce()Ziad BIZRIziad.bizri@ezako.com@BigDataEzako 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/
  • 2. 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 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/
  • 3. Running example« J’ai des fichiers de logs HTTP et je veux la listedes 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" 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/
  • 4. Mapper - simplepublic 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 {}} 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/
  • 5. 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 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/
  • 6. 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 {} } 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/
  • 7. 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! 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/
  • 8. Combiner - simplepublic 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)); }En entrée les paramètres de sortie du MapperEn sortie les paramètres d’entrée du Reducer 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/
  • 9. Besoin plus avancé« Je cherche tous les user agent uniques paradresse 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 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/
  • 10. MapCopySortReduce? 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/
  • 11. SortLe 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? 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/
  • 12. 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 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/
  • 13. 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); }} 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/
  • 14. 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()); }} 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/
  • 15. 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)); }} 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/
  • 16. 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)); }} 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/
  • 17. Questions? Mapper Reducer Shuffler Partitioner CopyReporter Configure Sort Combiner Join MultipleInputs CollectorCe 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/
  • 18. HUG France #2 - 11 Avril 2012 Aller plus loin que map() et reduce() Merci pour votre attentionZiad BIZRIziad.bizri@ezako.com@BigDataEzako 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/