Successfully reported this slideshow.
OS DESAFIOS COMPUTACIONAIS DE INDEXAR TERABYTES DE DADOS
AGENDA●   MOTIVAÇÃO●   COMO INDEXAR?●   COMO NOTIFICAR?●   COMO AGREGAR?●   COMO DISTRIBUIR?
COMPLEX EVENT   PROCESSING
TIME SERIESREAL-TIME
LOGS
MILHARES DEEQUIPAMENTOS
marvin@goldenheart ~ $ ssh root@deepthought****WELCOME TO 1 OF YOUR 38,157,987 SERVERS.TRY THE VEAL. ITS THE BEST IN THIS ...
COMO"DEBUGAR"?
LOG ÉTEXTO
MUITO TEXTO
3TB / DIA
3TB / DIA10.000.000.000 MSGS / DIA36 MB / SEGUNDO
JAVA
VISÃO GERAL                            ARMAZENAR  mensagens   INTERPRETAR    INDEXAR                            NOTIFICAR
RFC 3164: SYSLOG <34>Oct 11 22:14:15 mymachine su: su root failed for lonvick on /dev/pts/8 <priority = facility*8+severit...
CHAVE: VALORmessage    <34>Oct 11 22:14:15 mymachine su: su root           failed for lonvick on /dev/pts/8text       su, ...
<TERM, DOC*>ABACATE ➜ 12ABACAXI ➜ 1, 3, 9BANANA ➜ 2, 3, 42CAJU ➜ 3, 11, 42, 50DAMASCO ➜ 17, 18, 19...
CAJU E BANANA      CAJU ∩ BANANABANANA ➜ 2, 3, 42CAJU ➜ 3, 11, 42, 50CAJU ∩ BANANA ➜ 3, 42
CAJU OU BANANA      CAJU U BANANABANANA ➜ 2, 3, 42CAJU ➜ 3, 11, 42, 50CAJU U BANANA ➜ 2, 3, 11, 42, 50
QUERIESTERM       abacaxiPREFIX     abaca*WILDCARD   ab*a?iFUZZY      abacazi~RANGE      [abacaxi TO banana]
QUERIES    (cajá~ || bana*) -damasco Registros que contenham algo parecido com cajá (talvez cajú) ou algo que comece comba...
ORDENAÇÃO      (2, 3, 10, 11, 42, 50)      (10, 2, 11, 3, 42, 50)
ORDENAÇÃO Como ordenar 100M+ inteiros em tempo hábil? Arrays.sort(data) ➜ ~5s
ORDENAÇÃO SELEÇÃO Como encontrar os 1000 menores inteiros de um total de 100M+ em tempo hábil? introSelect(data, 1000) ➜ 3...
ORDENAÇÃO SELEÇÃOpublic void select(int[] data, int begin, int end, int m) {     if (begin >= end) return;     m = Math.mi...
BAIXA ENTROPIA
<10% de termos únicosmenor overhead por mensagem        MESSAGE BAG
<TERM, <DOC, POSITION*>*>ABACATE ➜ <12, 1, 2>ABACAXI ➜ <1, 1>, <3, 2>, <9, 1>BANANA ➜ <2, 1, 5>, <3, 2>, <10, 1>...
BUSCAS NO HISTÓRICO                   Thread #1              ids+positions                   Thread #2  busca       ids+po...
REALTIME (AKA TAIL -F)          MENSAGENS                      subscriber
REALTIME (AKA TAIL -F)          MENSAGENS                      subscriber                      subscriber                 ...
60 MessageBags / segundo +20 mil termos / MessageBag +   100+ queries registradas =                 #FAIL
TRANSIENT TERM TRIEABACAXIABACATEBANANA                              <RAIZ>                 ABACA                 BANANA  ...
AGREGAÇÃO           MENSAGENS      agregador                       subscriber
~10.000 eventos / segundohttp
1 evento / segundohttp => count()
~20 eventos / segundohttp => count()    by host
~20 eventos / 30 segundos http => count()     by hostevery 30 seconds
~20 eventos / 30 segundoshttp => avg(cputime#)        by host   every 30 seconds
<aggregationQuery>                              <subtraction>           <aggregation>                      <aggregation>  ...
type:http status:404=> :count=> :avglast(5) c5, :avglast(60) c60=> c5 > 1.25*c60 as alarm=> alarm != alarm:prev as changed...
DISTINCT COUNTCARDINALIDADE http => dcount(session_id)         every hour
DISTINCT COUNTCARDINALIDADE http => dcount(session_id)         every hour Usar HashSet<T> significaria manter  todos os se...
DISTINCT COUNTCARDINALIDADEHYPERLOGLOG SKETCHhash(input)  observar padrões de bits    acumular estimadores
DISTINCT COUNTCARDINALIDADEHYPERLOGLOG SKETCHhash(input)  observar padrões de bits    acumular estimadores"m" estimadores ...
É PRECISOESCALAR
taxa de leitura      MODERADA taxa de escrita   ALTÍSSIMAdependência entre os dados         BAIXA
SHARDING                         engine                LoadUDP/TCP 514              engine              Balancer          ...
Clusterengineengine   engine
Clusterengine                    Web     HTTP                   Serverengine   engine                    usuário          ...
Clusterengine                    Web     HTTP                   Serverengine   engine                    usuário
Clusterengine                   engineengine
Clusterengine         Multicast   engine   HTTPengine                               usuário
MULTICASTJChannel channel = new JChannel();channel.setReceiver(new ReceiverAdapter() {    public void receive(Message msg)...
STACK CONFIGURÁVEL
TUDO ESTÁ DISTRIBUÍDO
BUSCA engine           10                   mergesort, take 10          10    last 10 "http_status:   10 engine           ...
BUSCA engine           10                    mergesort, take 10          10    last 10 "http_status:    10 engine         ...
AGREGAÇÃO        http 200 => count() by host host                count foo                 1234 bar                 2345 b...
AGREGAÇÃO   count() + count() + count()  engine      engine       engine
AGREGAÇÃO        http 200 => avg(time) by host host                 avg_time foo                  0.888889 bar            ...
AGREGAÇÃO   avg(time) + avg(time) + avg(time)                   ?  engine         engine         engine
AGREGAÇÃO    sum(time) + sum(time) + sum(time) count(time) + count(time) + count(time)  engine          engine         eng...
E EM PRODUÇÃO?
9 BILHÕES DE LINHAS DE LOG  3TB EM DADOS ORIGINAIS     350GB DE ÍNDICE      3 SERVIDORES
2100+           TESTES98%LINHASCOBERTAS
OBRIGADO!   /juanplopes   @juanplopes   intelie.com.br        slideshare.net/juanplopes
uerj201212
uerj201212
uerj201212
uerj201212
Upcoming SlideShare
Loading in …5
×

uerj201212

398 views

Published on

Published in: Technology
  • Be the first to comment

  • Be the first to like this

uerj201212

  1. 1. OS DESAFIOS COMPUTACIONAIS DE INDEXAR TERABYTES DE DADOS
  2. 2. AGENDA● MOTIVAÇÃO● COMO INDEXAR?● COMO NOTIFICAR?● COMO AGREGAR?● COMO DISTRIBUIR?
  3. 3. COMPLEX EVENT PROCESSING
  4. 4. TIME SERIESREAL-TIME
  5. 5. LOGS
  6. 6. MILHARES DEEQUIPAMENTOS
  7. 7. marvin@goldenheart ~ $ ssh root@deepthought****WELCOME TO 1 OF YOUR 38,157,987 SERVERS.TRY THE VEAL. ITS THE BEST IN THIS FARM.****root@deepthought ~ $ tail -f /var/log.txt COMO ACESSAR OS LOGS?
  8. 8. COMO"DEBUGAR"?
  9. 9. LOG ÉTEXTO
  10. 10. MUITO TEXTO
  11. 11. 3TB / DIA
  12. 12. 3TB / DIA10.000.000.000 MSGS / DIA36 MB / SEGUNDO
  13. 13. JAVA
  14. 14. VISÃO GERAL ARMAZENAR mensagens INTERPRETAR INDEXAR NOTIFICAR
  15. 15. RFC 3164: SYSLOG <34>Oct 11 22:14:15 mymachine su: su root failed for lonvick on /dev/pts/8 <priority = facility*8+severity> <date/time> <host> <process> <message>
  16. 16. CHAVE: VALORmessage <34>Oct 11 22:14:15 mymachine su: su root failed for lonvick on /dev/pts/8text su, root, failed, for, lonvick, on, /dev/pts/8facility AUTHseverity CRITICALdate 20121011time 221415host mymachineprocess su
  17. 17. <TERM, DOC*>ABACATE ➜ 12ABACAXI ➜ 1, 3, 9BANANA ➜ 2, 3, 42CAJU ➜ 3, 11, 42, 50DAMASCO ➜ 17, 18, 19...
  18. 18. CAJU E BANANA CAJU ∩ BANANABANANA ➜ 2, 3, 42CAJU ➜ 3, 11, 42, 50CAJU ∩ BANANA ➜ 3, 42
  19. 19. CAJU OU BANANA CAJU U BANANABANANA ➜ 2, 3, 42CAJU ➜ 3, 11, 42, 50CAJU U BANANA ➜ 2, 3, 11, 42, 50
  20. 20. QUERIESTERM abacaxiPREFIX abaca*WILDCARD ab*a?iFUZZY abacazi~RANGE [abacaxi TO banana]
  21. 21. QUERIES (cajá~ || bana*) -damasco Registros que contenham algo parecido com cajá (talvez cajú) ou algo que comece combana, mas que definitivamente não contenham damasco.
  22. 22. ORDENAÇÃO (2, 3, 10, 11, 42, 50) (10, 2, 11, 3, 42, 50)
  23. 23. ORDENAÇÃO Como ordenar 100M+ inteiros em tempo hábil? Arrays.sort(data) ➜ ~5s
  24. 24. ORDENAÇÃO SELEÇÃO Como encontrar os 1000 menores inteiros de um total de 100M+ em tempo hábil? introSelect(data, 1000) ➜ 300ms
  25. 25. ORDENAÇÃO SELEÇÃOpublic void select(int[] data, int begin, int end, int m) { if (begin >= end) return; m = Math.min(m, end - begin); for (int depth = 0; depth < MAX_DEPTH; depth++) { int pivot = partition(data, begin, end, begin + (end - begin) / 2); int d = pivot - begin + 1; if (d == m) { return; } else if (m < d) { end = pivot; } else { m -= d; begin = pivot + 1; } } //fall back to heap sort when too deep heap.select(data, begin, end, m); }
  26. 26. BAIXA ENTROPIA
  27. 27. <10% de termos únicosmenor overhead por mensagem MESSAGE BAG
  28. 28. <TERM, <DOC, POSITION*>*>ABACATE ➜ <12, 1, 2>ABACAXI ➜ <1, 1>, <3, 2>, <9, 1>BANANA ➜ <2, 1, 5>, <3, 2>, <10, 1>...
  29. 29. BUSCAS NO HISTÓRICO Thread #1 ids+positions Thread #2 busca ids+positions ids+positions mensagens . . . Thread #n ids+positions ÍNDICE STORAGE
  30. 30. REALTIME (AKA TAIL -F) MENSAGENS subscriber
  31. 31. REALTIME (AKA TAIL -F) MENSAGENS subscriber subscriber subscriber #n
  32. 32. 60 MessageBags / segundo +20 mil termos / MessageBag + 100+ queries registradas = #FAIL
  33. 33. TRANSIENT TERM TRIEABACAXIABACATEBANANA <RAIZ> ABACA BANANA XI TE
  34. 34. AGREGAÇÃO MENSAGENS agregador subscriber
  35. 35. ~10.000 eventos / segundohttp
  36. 36. 1 evento / segundohttp => count()
  37. 37. ~20 eventos / segundohttp => count() by host
  38. 38. ~20 eventos / 30 segundos http => count() by hostevery 30 seconds
  39. 39. ~20 eventos / 30 segundoshttp => avg(cputime#) by host every 30 seconds
  40. 40. <aggregationQuery> <subtraction> <aggregation> <aggregation> <parseNumber> <parseNumber><search> <property> <property> http => avg(cputime#) - avg(systemtime#)
  41. 41. type:http status:404=> :count=> :avglast(5) c5, :avglast(60) c60=> c5 > 1.25*c60 as alarm=> alarm != alarm:prev as changed=> alarm by host every minute if changed
  42. 42. DISTINCT COUNTCARDINALIDADE http => dcount(session_id) every hour
  43. 43. DISTINCT COUNTCARDINALIDADE http => dcount(session_id) every hour Usar HashSet<T> significaria manter todos os session_ids em memória.
  44. 44. DISTINCT COUNTCARDINALIDADEHYPERLOGLOG SKETCHhash(input) observar padrões de bits acumular estimadores
  45. 45. DISTINCT COUNTCARDINALIDADEHYPERLOGLOG SKETCHhash(input) observar padrões de bits acumular estimadores"m" estimadores de 5 bits Std error: 104% / sqrt(m) m=216 ➜ 40KiB ➜ ~0.41%
  46. 46. É PRECISOESCALAR
  47. 47. taxa de leitura MODERADA taxa de escrita ALTÍSSIMAdependência entre os dados BAIXA
  48. 48. SHARDING engine LoadUDP/TCP 514 engine Balancer engine
  49. 49. Clusterengineengine engine
  50. 50. Clusterengine Web HTTP Serverengine engine usuário Broker
  51. 51. Clusterengine Web HTTP Serverengine engine usuário
  52. 52. Clusterengine engineengine
  53. 53. Clusterengine Multicast engine HTTPengine usuário
  54. 54. MULTICASTJChannel channel = new JChannel();channel.setReceiver(new ReceiverAdapter() { public void receive(Message msg) { System.out.println( msg.getSrc() + ": " + msg.getObject()); }});channel.connect("meuCanalDeChat");BufferedReader reader = new BufferedReader( new InputStreamReader(System.in));while(true) { String line = reader.readLine(); channel.send(null, line);}
  55. 55. STACK CONFIGURÁVEL
  56. 56. TUDO ESTÁ DISTRIBUÍDO
  57. 57. BUSCA engine 10 mergesort, take 10 10 last 10 "http_status: 10 engine 404" usuário 10 engine
  58. 58. BUSCA engine 10 mergesort, take 10 10 last 10 "http_status: 10 engine 404" before {id:84324814} usuário 10 engine
  59. 59. AGREGAÇÃO http 200 => count() by host host count foo 1234 bar 2345 baz 3456
  60. 60. AGREGAÇÃO count() + count() + count() engine engine engine
  61. 61. AGREGAÇÃO http 200 => avg(time) by host host avg_time foo 0.888889 bar 0.224568 baz 5.623424
  62. 62. AGREGAÇÃO avg(time) + avg(time) + avg(time) ? engine engine engine
  63. 63. AGREGAÇÃO sum(time) + sum(time) + sum(time) count(time) + count(time) + count(time) engine engine engine
  64. 64. E EM PRODUÇÃO?
  65. 65. 9 BILHÕES DE LINHAS DE LOG 3TB EM DADOS ORIGINAIS 350GB DE ÍNDICE 3 SERVIDORES
  66. 66. 2100+ TESTES98%LINHASCOBERTAS
  67. 67. OBRIGADO! /juanplopes @juanplopes intelie.com.br slideshare.net/juanplopes

×