uerj201212

71
OS DESAFIOS COMPUTACIONAIS DE INDEXAR TERABYTES DE DADOS

Upload: juan-lopes

Post on 17-Jul-2015

201 views

Category:

Technology


0 download

TRANSCRIPT

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 DE EQUIPAMENTOS

marvin@goldenheart ~ $ ssh root@deepthought****WELCOME TO 1 OF YOUR 38,157,987 SERVERS. TRY THE VEAL. IT'S THE BEST IN THIS FARM.****

root@deepthought ~ $ tail -f /var/log.txt

COMO ACESSAR OS LOGS?

COMO "DEBUGAR"?

LOG ÉTEXTO

MUITO TEXTO

3TB / DIA

3TB / DIA10.000.000.000 MSGS / DIA

36 MB / SEGUNDO

JAVA

VISÃO GERAL

INDEXAR

ARMAZENAR

INTERPRETARmensagens

NOTIFICAR

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>

CHAVE: VALOR

<34>Oct 11 22:14:15 mymachine su: 'su root' failed for lonvick on /dev/pts/8

message

facility AUTH

severity CRITICAL

host mymachine

process su

date 20121011

time 221415

text su, root, failed, for, lonvick, on, /dev/pts/8

<TERM, DOC*>

ABACATE ➜ 12ABACAXI ➜ 1, 3, 9BANANA ➜ 2, 3, 42CAJU ➜ 3, 11, 42, 50DAMASCO ➜ 17, 18, 19...

CAJU E BANANA

CAJU ∩ BANANA

BANANA ➜ 2, 3, 42CAJU ➜ 3, 11, 42, 50

CAJU ∩ BANANA ➜ 3, 42

CAJU OU BANANA

CAJU U BANANA

BANANA ➜ 2, 3, 42CAJU ➜ 3, 11, 42, 50

CAJU U BANANA ➜ 2, 3, 11, 42, 50

TERM 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 com

bana, mas que definitivamente não contenham

damasco.

QUERIES

(2, 3, 10, 11, 42, 50)

(10, 2, 11, 3, 42, 50)

ORDENAÇÃO

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) ➜ 300ms

ORDENAÇÃO SELEÇÃO public 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);

}

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

ÍNDICE

busca

ids+positions

STORAGE

ids+positions

ids+positions

ids+positions mensagens

Thread #1

Thread #2

.

.

.Thread #n

BUSCAS NO HISTÓRICO

REALTIME (AKA TAIL -F)

MENSAGENS

subscriber

REALTIME (AKA TAIL -F)

MENSAGENS

subscribersubscribersubscriber

#n

60 MessageBags / segundo +20 mil termos / MessageBag +

100+ queries registradas =

#FAIL

TRANSIENT TERM TRIE

ABACAXIABACATEBANANA

<RAIZ>

ABACA

XI TE

BANANA

AGREGAÇÃO

MENSAGENS

subscriber

agregador

http

~10.000 eventos / segundo

http => count()

1 evento / segundo

http => count()by host

~20 eventos / segundo

http => count()by host

every 30 seconds

~20 eventos / 30 segundos

http => avg(cputime#)by host

every 30 seconds

~20 eventos / 30 segundos

http => avg(cputime#) - avg(systemtime#)

<search> <property>

<parseNumber>

<aggregation>

<property>

<parseNumber>

<aggregation>

<subtraction>

<aggregationQuery>

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

http => dcount(session_id)every hour

DISTINCT COUNT

CARDINALIDADE

Usar HashSet<T> significaria manter todos os session_ids em memória.

DISTINCT COUNT

CARDINALIDADE

http => dcount(session_id)every hour

DISTINCT COUNTCARDINALIDADE

HYPERLOGLOG SKETCH

hash(input)observar padrões de bitsacumular estimadores

DISTINCT COUNTCARDINALIDADE

HYPERLOGLOG SKETCH

hash(input)observar padrões de bitsacumular estimadores

"m" estimadores de 5 bitsStd error: 104% / sqrt(m)m=216 ➜ 40KiB ➜ ~0.41%

É PRECISO

ESCALAR

taxa de leituraMODERADA

taxa de escritaALTÍSSIMA

dependência entre os dados

BAIXA

SHARDING

LoadBalancer

engine

engine

engine

UDP/TCP 514

Cluster

engine

engineengine

Cluster

engine

engineengine

HTTP

usuário

WebServer

Broker

Cluster

engine

engineengine

HTTP

usuário

WebServer

Cluster

engine

engineengine

Cluster

HTTP

usuário

Multicast

engine

engine

engine

MULTICAST

JChannel 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);}

STACK CONFIGURÁVEL

TUDO ESTÁ DISTRIBUÍDO

last 10 "http_status:404"

10

10

10

10

usuário

engine

engine

engine

mergesort, take 10

BUSCA

engine

engine

engine

last 10 "http_status:404"

before {id:84324814}

10

10

10

10

usuário

mergesort, take 10

BUSCA

http 200 => count() by host

host count

foo 1234

bar 2345

baz 3456

AGREGAÇÃO

count() + count() + count()

engine engine engine

AGREGAÇÃO

http 200 => avg(time) by host

host avg_time

foo 0.888889

bar 0.224568

baz 5.623424

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)

AGREGAÇÃO

engine engine engine

E EM PRODUÇÃO?

9 BILHÕES DE LINHAS DE LOG

3TB EM DADOS ORIGINAIS

350GB DE ÍNDICE

3 SERVIDORES

2100+ TESTES

98% LINHAS COBERTAS

OBRIGADO!

/juanplopes

@juanplopes

intelie.com.br

slideshare.net/juanplopes