SlideShare una empresa de Scribd logo
1 de 28
Descargar para leer sin conexión
HyperLogLog
Florent Le Gall @flornt
Développeur Full Stack
• EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS
2
• L’algorithme démystifié
• Le principe mathématique
• Les différentes étapes
• Son implémentation guidée par les tests
• Hands-on en Scala ou en Java
HyperAgendaAgenda
• EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS
3
• Un algorithme pour compter les
occurrences uniques
• Combien d’adresses IPs uniques dans
mes logs ?
• Combien de mots dans toutes les oeuvres
de Shakespeare ?
HyperLogLog
• EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS
4
• 1, 2, 3, …
Compter c’est facile !
• EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS
5
• La méthode naïve :
• Set<String> counter = new HashSet<>()
• counter.add(sheep1);
• counter.add(sheep2);
• ….
• counter.add(sheep1337);
• return counter.size()
Compter c’est facile !
• EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS
6
• Avantages
• Le résultat est exact
• Inconvénients
• Nécessite de stocker toutes les
occurrences uniques
• Difficile à répartir sans répliquer plein de
données !
La méthode naïve
• EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS
7
• Ne pas stocker les mots, stocker
uniquement les valeurs de hachage
• Assez peu économe, on a toujours besoin
d’autant de valeurs que de mots
Comment stocker moins ?
• EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS
8
• Pour chaque mot : on calcule sa valeur de
hachage
• On stocke la présence ou l’absence de la
valeur de hachage dans un tableau de bits.
• À la position donnée par les N-premiers
bits de la valeur de hachage
• Il suffit à la fin de compter le nombre de
valeurs marquées
L’approche Bitmap
• EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS
9
• Nécessite de bien dimensionner le tableau
• Si trop petit : on va avoir beaucoup de
collisions et des résultats complètement
faux
• Il faut connaître à l’avance une
approximation de ce qu’on cherche :(
L’approche Bitmap
• EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS
10
L’approche probabiliste
0101XY…
1111XY…
0100XY…
0000XY…
1110XY…
0110XY…
0111XY…
1000XY…
1001XY…
0011XY…
1011XY…
0001XY…
1100XY…
1101XY…
0010XY…
1010XY…
Soit un ensemble de nombres aléatoires
0000XY
On a une probabilité de 1/16 de trouver
un nombre qui commence par 0000
• EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS
11
L’approche probabiliste
0101XY…
1111XY…
0100XY…
0000XY…
1110XY…
0110XY…
0111XY…
1000XY…
1001XY…
0011XY…
1011XY…
0001XY…
1100XY…
1101XY…
0010XY…
1010XY…
À l’inverse
0000XY
On rencontre un seul nombre
commençant par 4 zéros
La cardinalité de l’ensemble est
probablement de 16 : (2^4)
• EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS
12
• Pour chaque mot
• On calcule sa valeur de hachage
• On compte le nombre de zéros au début
de cette valeur
• On conserve le nombre de zéros le plus
élevé parmi toutes les valeurs rencontrées
• Une approximation grossière est :
L’approche probabiliste
• EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS
13
• Oui, mais c’est très grossier !
• Il suffit d’une seule valeur de hachage
très basse pour déterminer la cardinalité
• La précision est plutôt faible : 32 valeurs
possibles pour 4 milliard de résultats
• Le résultat est exponentiel
• La marge d’erreur est élevée
L’approche probabiliste
• EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS
14
• Distribuer l’erreur sur plusieurs registres
• Pour chaque valeur de hachage :
• Lui attribuer un registre
• Compter le nombre de zéros au début de
la valeur
• Retenir le maximum du nombre de zéros
par registre
• Faire la moyenne des registres !
Comment faire mieux ?
• EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS
15
*LogLog
000110101011001100101 00011001
Pour une valeur de hachage donnée
On détermine la position
du premier 1 (ici 4)
On obtient l’index à
utiliser (ici 25)
N bits pour l’index, soit 2^N registres
• EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS
16
*LogLog
Pour la valeur
5
4
5
6
3
4
5
6
3
6
5
4
3
5
6
5
On détermine son registre
On détermine la position du 1er “1”
firstOneRank = 5
register(5) = max(register(5), firstOneRank)
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
registerIndex = 5
000010101011001100101 0101
• EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS
17
*LogLog
5
4
5
6
3
5
5
6
3
6
5
4
3
5
6
5
On détermine son registre
On détermine la position du 1er “1”
firstOneRank = 5
register(5) = max(register(5), firstOneRank)
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
registerIndex = 5
On met à jour le registre
Pour la valeur 000010101011001100101 0101
• EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS
18
• LogLog utilise la moyenne arithmétique
LogLog
• n : le nombre de registres
• register_i : la valeur du registre i
• biasCorrection : la constante de correction
• EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS
19
• HyperLogLog utilise la moyenne
harmonique
HyperLogLog
• n : le nombre de registres
• register_i : la valeur du registre i
• biasCorrection : la constante de correction
• EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS
20
• LogLog :
• Pour m registres : Précision: 1.30/Sqrt(m)
• 1024 registres (1ko) -> 4% d’erreur
• HyperLogLog :
• Pour m registres : Précision: 1.04/Sqrt(m)
• 512 registres (1ko) -> 4% d’erreur
Est-ce que ça marche bien ?
• EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS
21
Fusionner deux compteurs
5
4
5
6
3
4
+
3
5
3
7
4
5
5
5
5
7
4
5
=
• La fusion (+) est une opération associative
• Le compteur vide est un élément neutre
• C’est donc un ….
• Monoïde !!
max(a,b)
• EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS
22
Fusionner deux compteurs
• Permet de répartir le décompte sur
plusieurs environnements
• Chaque environnement remplit ses
registres
• Les registres sont fusionnés plus tard
• Peu de données sont à transférer : juste un
set de registres
• EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS
23
Des algorithmes récents
• LogLog
• Publié en 2003 par Marianne Durand &
Philippe Flajolet (INRIA)
• HyperLogLog
• Publié en 2007 par Philippe Flajolet, Eric
Fusy, Olivier Gandouet et Frédéric
Meunier (INRIA / LIRMM)
• EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS
24
• Présentation à Devoxx de DuyHai DOAN
• http://cfp.devoxx.fr/2015/talk/HLV-3716/Algorithmes_distribues_pour_le_Big_Data
• Les papiers sur l’algorithme :
• LogLog : http://algo.inria.fr/flajolet/
Publications/DuFl03.pdf
• HyperLogLog : http://algo.inria.fr/flajolet/
Publications/FlFuGaMe07.pdf
Pour approfondir
• EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS
25
Vous avez une heure !
• Scala or Java choose your weapon !
• https://github.com/flegall/xke-hyperloglog
• EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS
26
• C’est puissant, c’est très approprié si vos
données sont réparties
• Même si c’est simple, ne les implémentez
pas vous-même: il y’a pas mal
d’implémentations déjà écrites
• https://github.com/twitter/algebird
(utilisé par Spark)
Pour conclure
• EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS
27
Questions
?
Merci!

Más contenido relacionado

Similar a Hyper LogLog

cours-algorithmique1.ppt
cours-algorithmique1.pptcours-algorithmique1.ppt
cours-algorithmique1.pptkaoutarHmiza
 
Intro_Programmation_Informatique
Intro_Programmation_InformatiqueIntro_Programmation_Informatique
Intro_Programmation_InformatiqueEmeric Tapachès
 
Ch4 circuitscombinatoires
Ch4 circuitscombinatoiresCh4 circuitscombinatoires
Ch4 circuitscombinatoiresmickel iron
 
Programmation fonctionnelle
Programmation fonctionnelleProgrammation fonctionnelle
Programmation fonctionnelleGeeks Anonymes
 
Ch1 circuits logiques_p1_combinatoire-v3
Ch1 circuits logiques_p1_combinatoire-v3Ch1 circuits logiques_p1_combinatoire-v3
Ch1 circuits logiques_p1_combinatoire-v3linuxscout
 
Info smpc2 part1
Info smpc2 part1Info smpc2 part1
Info smpc2 part1mostafadess
 
Tout sur PHP 7.3 et ses RFC
Tout sur PHP 7.3 et ses RFCTout sur PHP 7.3 et ses RFC
Tout sur PHP 7.3 et ses RFCDamien Seguy
 
Ch3 algebreboole
Ch3 algebrebooleCh3 algebreboole
Ch3 algebreboolemickel iron
 
Ch3 algebreboole
Ch3 algebrebooleCh3 algebreboole
Ch3 algebreboolemickel iron
 
IEEE754-pourquoi_les_calculs_informatiques_sont_faux
IEEE754-pourquoi_les_calculs_informatiques_sont_fauxIEEE754-pourquoi_les_calculs_informatiques_sont_faux
IEEE754-pourquoi_les_calculs_informatiques_sont_fauxRuau Mickael
 

Similar a Hyper LogLog (11)

cours-algorithmique1.ppt
cours-algorithmique1.pptcours-algorithmique1.ppt
cours-algorithmique1.ppt
 
Intro_Programmation_Informatique
Intro_Programmation_InformatiqueIntro_Programmation_Informatique
Intro_Programmation_Informatique
 
Ch4 circuitscombinatoires
Ch4 circuitscombinatoiresCh4 circuitscombinatoires
Ch4 circuitscombinatoires
 
Programmation fonctionnelle
Programmation fonctionnelleProgrammation fonctionnelle
Programmation fonctionnelle
 
BackDay Xebia : Microservices en démo
BackDay Xebia : Microservices en démoBackDay Xebia : Microservices en démo
BackDay Xebia : Microservices en démo
 
Ch1 circuits logiques_p1_combinatoire-v3
Ch1 circuits logiques_p1_combinatoire-v3Ch1 circuits logiques_p1_combinatoire-v3
Ch1 circuits logiques_p1_combinatoire-v3
 
Info smpc2 part1
Info smpc2 part1Info smpc2 part1
Info smpc2 part1
 
Tout sur PHP 7.3 et ses RFC
Tout sur PHP 7.3 et ses RFCTout sur PHP 7.3 et ses RFC
Tout sur PHP 7.3 et ses RFC
 
Ch3 algebreboole
Ch3 algebrebooleCh3 algebreboole
Ch3 algebreboole
 
Ch3 algebreboole
Ch3 algebrebooleCh3 algebreboole
Ch3 algebreboole
 
IEEE754-pourquoi_les_calculs_informatiques_sont_faux
IEEE754-pourquoi_les_calculs_informatiques_sont_fauxIEEE754-pourquoi_les_calculs_informatiques_sont_faux
IEEE754-pourquoi_les_calculs_informatiques_sont_faux
 

Hyper LogLog

  • 1. HyperLogLog Florent Le Gall @flornt Développeur Full Stack
  • 2. • EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS 2 • L’algorithme démystifié • Le principe mathématique • Les différentes étapes • Son implémentation guidée par les tests • Hands-on en Scala ou en Java HyperAgendaAgenda
  • 3. • EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS 3 • Un algorithme pour compter les occurrences uniques • Combien d’adresses IPs uniques dans mes logs ? • Combien de mots dans toutes les oeuvres de Shakespeare ? HyperLogLog
  • 4. • EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS 4 • 1, 2, 3, … Compter c’est facile !
  • 5. • EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS 5 • La méthode naïve : • Set<String> counter = new HashSet<>() • counter.add(sheep1); • counter.add(sheep2); • …. • counter.add(sheep1337); • return counter.size() Compter c’est facile !
  • 6. • EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS 6 • Avantages • Le résultat est exact • Inconvénients • Nécessite de stocker toutes les occurrences uniques • Difficile à répartir sans répliquer plein de données ! La méthode naïve
  • 7. • EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS 7 • Ne pas stocker les mots, stocker uniquement les valeurs de hachage • Assez peu économe, on a toujours besoin d’autant de valeurs que de mots Comment stocker moins ?
  • 8. • EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS 8 • Pour chaque mot : on calcule sa valeur de hachage • On stocke la présence ou l’absence de la valeur de hachage dans un tableau de bits. • À la position donnée par les N-premiers bits de la valeur de hachage • Il suffit à la fin de compter le nombre de valeurs marquées L’approche Bitmap
  • 9. • EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS 9 • Nécessite de bien dimensionner le tableau • Si trop petit : on va avoir beaucoup de collisions et des résultats complètement faux • Il faut connaître à l’avance une approximation de ce qu’on cherche :( L’approche Bitmap
  • 10. • EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS 10 L’approche probabiliste 0101XY… 1111XY… 0100XY… 0000XY… 1110XY… 0110XY… 0111XY… 1000XY… 1001XY… 0011XY… 1011XY… 0001XY… 1100XY… 1101XY… 0010XY… 1010XY… Soit un ensemble de nombres aléatoires 0000XY On a une probabilité de 1/16 de trouver un nombre qui commence par 0000
  • 11. • EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS 11 L’approche probabiliste 0101XY… 1111XY… 0100XY… 0000XY… 1110XY… 0110XY… 0111XY… 1000XY… 1001XY… 0011XY… 1011XY… 0001XY… 1100XY… 1101XY… 0010XY… 1010XY… À l’inverse 0000XY On rencontre un seul nombre commençant par 4 zéros La cardinalité de l’ensemble est probablement de 16 : (2^4)
  • 12. • EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS 12 • Pour chaque mot • On calcule sa valeur de hachage • On compte le nombre de zéros au début de cette valeur • On conserve le nombre de zéros le plus élevé parmi toutes les valeurs rencontrées • Une approximation grossière est : L’approche probabiliste
  • 13. • EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS 13 • Oui, mais c’est très grossier ! • Il suffit d’une seule valeur de hachage très basse pour déterminer la cardinalité • La précision est plutôt faible : 32 valeurs possibles pour 4 milliard de résultats • Le résultat est exponentiel • La marge d’erreur est élevée L’approche probabiliste
  • 14. • EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS 14 • Distribuer l’erreur sur plusieurs registres • Pour chaque valeur de hachage : • Lui attribuer un registre • Compter le nombre de zéros au début de la valeur • Retenir le maximum du nombre de zéros par registre • Faire la moyenne des registres ! Comment faire mieux ?
  • 15. • EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS 15 *LogLog 000110101011001100101 00011001 Pour une valeur de hachage donnée On détermine la position du premier 1 (ici 4) On obtient l’index à utiliser (ici 25) N bits pour l’index, soit 2^N registres
  • 16. • EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS 16 *LogLog Pour la valeur 5 4 5 6 3 4 5 6 3 6 5 4 3 5 6 5 On détermine son registre On détermine la position du 1er “1” firstOneRank = 5 register(5) = max(register(5), firstOneRank) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 registerIndex = 5 000010101011001100101 0101
  • 17. • EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS 17 *LogLog 5 4 5 6 3 5 5 6 3 6 5 4 3 5 6 5 On détermine son registre On détermine la position du 1er “1” firstOneRank = 5 register(5) = max(register(5), firstOneRank) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 registerIndex = 5 On met à jour le registre Pour la valeur 000010101011001100101 0101
  • 18. • EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS 18 • LogLog utilise la moyenne arithmétique LogLog • n : le nombre de registres • register_i : la valeur du registre i • biasCorrection : la constante de correction
  • 19. • EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS 19 • HyperLogLog utilise la moyenne harmonique HyperLogLog • n : le nombre de registres • register_i : la valeur du registre i • biasCorrection : la constante de correction
  • 20. • EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS 20 • LogLog : • Pour m registres : Précision: 1.30/Sqrt(m) • 1024 registres (1ko) -> 4% d’erreur • HyperLogLog : • Pour m registres : Précision: 1.04/Sqrt(m) • 512 registres (1ko) -> 4% d’erreur Est-ce que ça marche bien ?
  • 21. • EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS 21 Fusionner deux compteurs 5 4 5 6 3 4 + 3 5 3 7 4 5 5 5 5 7 4 5 = • La fusion (+) est une opération associative • Le compteur vide est un élément neutre • C’est donc un …. • Monoïde !! max(a,b)
  • 22. • EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS 22 Fusionner deux compteurs • Permet de répartir le décompte sur plusieurs environnements • Chaque environnement remplit ses registres • Les registres sont fusionnés plus tard • Peu de données sont à transférer : juste un set de registres
  • 23. • EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS 23 Des algorithmes récents • LogLog • Publié en 2003 par Marianne Durand & Philippe Flajolet (INRIA) • HyperLogLog • Publié en 2007 par Philippe Flajolet, Eric Fusy, Olivier Gandouet et Frédéric Meunier (INRIA / LIRMM)
  • 24. • EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS 24 • Présentation à Devoxx de DuyHai DOAN • http://cfp.devoxx.fr/2015/talk/HLV-3716/Algorithmes_distribues_pour_le_Big_Data • Les papiers sur l’algorithme : • LogLog : http://algo.inria.fr/flajolet/ Publications/DuFl03.pdf • HyperLogLog : http://algo.inria.fr/flajolet/ Publications/FlFuGaMe07.pdf Pour approfondir
  • 25. • EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS 25 Vous avez une heure ! • Scala or Java choose your weapon ! • https://github.com/flegall/xke-hyperloglog
  • 26. • EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS 26 • C’est puissant, c’est très approprié si vos données sont réparties • Même si c’est simple, ne les implémentez pas vous-même: il y’a pas mal d’implémentations déjà écrites • https://github.com/twitter/algebird (utilisé par Spark) Pour conclure
  • 27. • EBIA ALLIANCE = XEBIA + XEBIALABS + THIGA + UX REPUBLIC + AKAMIS 27 Questions ?