qconrio2015
-
Upload
juan-lopes -
Category
Software
-
view
540 -
download
1
Transcript of qconrio2015
3,000,000,000 mensagens/dia
3,000,000,000 mensagens/dia
1 terabytepor dia
100,000,000,000mensagens de retenção no índice
3,000,000,000 mensagens/dia
1 terabytepor dia
3,000,000,000 mensagens/dia
1 terabytepor dia
100,000,000,000mensagens de retenção no índice
3 máquinas8GB de RAM em cada
LUCENE ESCALA?
Full-text para Big Data com
hardware modesto
@JUANPLOPES
TERM
TERM
TERM
TERMTERM
QUEM SOU EU?UMA PERGUNTA PROFUNDA
PAI DO MIGUELGERENTE DE PAPINHAS SUPERVISOR DE BRINCADEIRAS
PROGRAMADOR @INTELIEMAGO DOS COMPILADORESCO-DIRETOR DE TRETAS CORPORATIVAS
MESTRANDO @IME/UERJCIÊNCIAS COMPUTACIONAISVICIADO EM COMPETIÇÕES DE PROGRAMAÇÃO
QUEM SOU EU?UMA PERGUNTA PROFUNDA
GITHUB.COM
TWITTER.COM
/JUANPLOPES
Ffaixas de frequência 40, 43, 45FAT 17fault tolerance 40, 41, 43FCC 17, 45fibra óptica 41, 43Ggateway 41, 99
ÍNDICE REMISSIVOPOUCA GENTE USA, MAS É ÚTIL
40 41 43 45
17
99
“fault tolerance”
40
ÍNDICE REMISSIVOQUERIES BOOLEANAS
41 43
“faixas de frequência”
40 43 45
ÍNDICE REMISSIVOQUERIES BOOLEANAS
“fault tolerance” OR “faixas de frequência”
40 43 4541
ÍNDICE REMISSIVOQUERIES BOOLEANAS
“fault tolerance” AND “faixas de frequência”
40 43
SUBJECT Important! Don’t let this leakFROM John Doe <[email protected]> TO Alice Legit <[email protected]>,
Bob Legit <[email protected]>BCC Eve Eavesdropper <[email protected]>BODY
Here is the password: pa$$word
DOCUMENTOA UNIDADE BÁSICA DO LUCENE
SUBJECT Important! Don’t let this leakFROM John Doe <[email protected]> TO Alice Legit <[email protected]>,
Bob Legit <[email protected]>BCC Eve Eavesdropper <[email protected]>BODY
Here is the password: pa$$word
DOCUMENTOÉ PRECISO SEPARAR OS CAMPOS EM TOKENS
SUBJECT important! dont let this leakFROM john doe <[email protected]> TO alice legit <[email protected]>,
bob legit <[email protected]>BCC eve eavesdropper <[email protected]>BODY
here is the password: pa$$word
DOCUMENTOCADA TOKEN PRECISA ESTAR NORMALIZADO
DOCUMENTORESULTADO: CAMPOS E TERMOS
FROM doe, john, [email protected]
TO alice, [email protected], bob, [email protected], legit
BCC eavesdropper, eve, [email protected]
SUBJECT dont, leak, let, this
BODY here, password
DOCUMENT
DOCUMENTORESULTADO: CAMPOS E TERMOS
DOCUMENT
INDEXWRITER
DOCUMENT #0
DOCUMENTOAO INDEXAR, RECEBE UM ID
SEGMENT #0
INDEX WRITERESCREVE UM SEGMENTO POR VEZ
SEGMENT #0
INDEX WRITERESCREVE UM SEGMENTO POR VEZ
X #0
TERM_1: #0
TERM_3: #0
TERM_4: #0
SEGMENT #0
INDEX WRITERESCREVE UM SEGMENTO POR VEZ
Y #1
TERM_1: #0
TERM_3: #0, #1
TERM_4: #0
TERM_2: #1
TERM_5: #1
SEGMENT #0
INDEX WRITERESCREVE UM SEGMENTO POR VEZ
Z #2
TERM_1: #0, #2
TERM_3: #0, #1, #2
TERM_4: #0
TERM_2: #1, #2
TERM_5: #1
SEGMENT #0
INDEX WRITERESCREVE UM SEGMENTO POR VEZ
TERM_1: #0, #2
TERM_3: #0, #1, #2
TERM_2: #1, #2
TERM_5: #1
TERM_4: #0
SEGMENT #1
INDEX WRITERESCREVE UM SEGMENTO POR VEZ
#0
SEGMENTOSSÃO IMUTÁVEIS. MESMO.
-010 docs
-1
SEGMENTOSSÃO IMUTÁVEIS. MESMO.
10 docs
SEGMENTOSSÃO IMUTÁVEIS. MESMO.
-110 docs
-033 docs
SEGMENTOSSÃO IMUTÁVEIS. MESMO.
-019 docs
-310 docs
-533 docs
SEGMENTOSCADA SEGMENTO É UM PEQUENO ÍNDICE
INDEXREADER
INDEXREADER
INDEXREADER
-019 docs
-310 docs
-533 docs
COMPOSITEREADER
SEGMENTOSID DO DOCUMENTO MUDA POR READER
-019 docs
-310 docs
-533 docs
INDEXREADER
-862 docs
0..9
10..42
43..61
0..61
SEGMENTOSÁS VEZES É PRECISO FAZER MERGE
-090 docs -887 docs -144 docs -041 docs
-033 docs -430 docs -025 docs -022 docs
-018 docs -310 docs -15 docs -03 docs
SEGMENTOSÁS VEZES É PRECISO FAZER MERGE
-090 docs -887 docs -144 docs -041 docs
-033 docs -430 docs -025 docs -022 docs
-018 docs -310 docs -15 docs -03 docs
-030 docs
SEGMENTOSÁS VEZES É PRECISO FAZER MERGE
-090 docs -887 docs -144 docs -041 docs
-033 docs -430 docs -025 docs -022 docs
-030 docs
SEGMENTOSA ANATOMIA DO SEGMENTO #0
_0.FNM
_0.FDX
_0.TIM
_0.TIP
_0.FRQ
_0.PRX
_0.FDT
_0.DEL
_0.NRM
_0.NRM
_0.FDX
_0.TIM
_0.TIP
_0.FRQ
_0.PRX
_0.FDT
_0.DEL
SEGMENTOSA ANATOMIA DO SEGMENTO #0
_0.FNM
FNM: FIELD NAMESMantém informações sobre quais campos existem no segmento, bem como o tipo do campo em cada documento.
_0.NRM
_0.FDX
_0.TIM
_0.TIP
_0.PRX
_0.FDT
_0.FRQ
_0.FNM
_0.DEL
SEGMENTOSA ANATOMIA DO SEGMENTO #0
DEL: DELETED DOCSArquivo mutável. Guarda IDs de documentos deletados do índice.
_0.NRM
_0.FDT
_0.FDX
_0.DEL
_0.FNM
_0.TIM
_0.TIP
_0.PRX
_0.FRQ
SEGMENTOSA ANATOMIA DO SEGMENTO #0
THE POSTINGS FORMATSão o coração do Lucene. O formato mudou consideravelmente no Lucene 4.0.0.
_0.NRM
_0.PRX
_0.FRQ
_0.DEL
_0.FDX
_0.FDT
_0.FNM
SEGMENTOSA ANATOMIA DO SEGMENTO #0
_0.TIM
_0.TIP
TIM E TIP: TERM INDEXArmazenam os termos. O TIP é um “índice do índice” e permite navegar mais rapidamente dentro do TIM.
_0.NRM
_0.FDT
_0.FDX
_0.DEL
_0.FNM
_0.TIM
_0.TIP
_0.PRX
_0.FRQ
SEGMENTOSA ANATOMIA DO SEGMENTO #0
FRQ: FREQUENCIESArmazenam quais documentos contém cada termo, bem como a frequência que os termos aparecem.
_0.NRM
_0.FDT
_0.FDX
_0.TIM
_0.TIP
_0.DEL
_0.FNM
_0.FRQ
_0.PRX
SEGMENTOSA ANATOMIA DO SEGMENTO #0
PRX: POSITIONSOpcional. Armazena as posições em que cada termo aparece nos documentos.
_0.NRM
_0.TIM
_0.TIP
_0.DEL
_0.FNM
_0.FRQ
_0.PRX
_0.FDT
_0.FDX
SEGMENTOSA ANATOMIA DO SEGMENTO #0
FDX E FDT: STORED FIELDSArmazena certos campos indexados por documento. FDX indexa o conteúdo em FDT.
_0.FDT
_0.FDX
_0.TIM
_0.TIP
_0.DEL
_0.FNM
_0.FRQ
_0.PRX
SEGMENTOSA ANATOMIA DO SEGMENTO #0
NRM: NORMSArmazena informações para ajudar na ordenação de resultados relevantes.
_0.NRM
Perceba que estes slides não falam de TermVectors.
É proposital.Lucene não é banco de dados.
SEGMENTOSTERM VECTORS CONSIDERED HARMFUL
_0.TVD
_0.TVX
_0.TVF
FILE FORMATPRECISAMOS FALAR DE BYTES(BEM DE LEVE)
TERM_2 2 3 5 6 7 9 12 13
TERM_3
TERM_1Docs
FILE FORMATPRECISAMOS FALAR DE BYTES(BEM DE LEVE)
TERM_2 2 1 2 1 1 2 3 1
TERM_3
TERM_1DocDeltas
FILE FORMATPRECISAMOS FALAR DE BYTES(BEM DE LEVE)
TERM_2 2 1 2 1 1 2 3 1
TERM_3
TERM_1Não vi vantagem. Ainda são 32 bits!
DocDeltas
FILE FORMATVENI VIDI V-INT
32-BIT LITTLE ENDIAN INT
= 123,456,789
= 1
32-BIT V-INT
FILE FORMATVENI VIDI V-INT
= 123,456,789
= 1
= 128
FILE FORMATVENI VIDI V-INT
DE ATÉ CUSTA
0 127 1 byte
128 16,383 2 bytes
16,384 2,097,151 3 bytes
2,097,152 268,435,455 4 bytes
268,435,456 4,294,967,296 5 bytes
VANTAGENS
MENOS ESPAÇOMENOS I/O
DESVANTAGENS
IMPOSSÍVEL ITERAR AO CONTRÁRIODIFÍCIL ACESSO ALEATÓRIOMAIOR CUSTO DE PROCESSAMENTO
FILE FORMATVENI VIDI V-INT
VAMOS FALAR DE DESAFIOS?PRODUÇÃO, AINDA TEM TEMPO?
PROBLEMASFALANDO EM INTEIROS
DOCID :: INT32i.e.
DOCID < 2,147,483,648
_0.FDX
_0.TIM
_0.TIP
_0.FRQ
_0.PRX
_0.FDT
PROBLEMASO QUE CRESCE NO ÍNDICE?
TERM INDEXTERMO EM UTF8 + BYTES CONSTANTES / TERMO
FREQUENCIES AND POSITIONS~2 BYTES / TERMO DISTINTO / DOCUMENTOA PRINCÍPIO, SEM POSITIONS
STORED FIELDSSOMENTE ID, 16 BYTES / DOCUMENTO+ OVERHEAD 8 BYTES / DOCUMENTO
PROBLEMAS100% DE OVERHEAD DE ÍNDICE? NEM PENSAR!
LUCENEINDEX
RAW STORAGE
ID
APIQUERY
MSGS
SOLUÇÃO?AGRUPAR MENSAGENS
DOCUMENT
MSG
MSG
MSG
MSG
MSG
MSG
SOLUÇÃO?AGRUPAR MENSAGENS
VANTAGENS
MENOS TERMOS DISTINTOSMENOR OVERHEAD COM STORED FIELDSMENOS DOCIDsÍNDICE MENOR (MENOS I/O)
DESVANTAGENS
OVERHEAD DE FILTRO PÓS QUERYSEM QUERIES “AND” E “NOT”
SOLUÇÃO?TEM UM PROBLEMÃO
TERMS:
A, B, C
A, B B, CA AND C→ TRUEERRADO: Deveria ser false, pois nenhuma mensagem individual contém A e C.
A AND NOT C→ FALSEERRADO: Deveria ser true, pois há uma mensagem que contém A e não contém C.
SOLUÇÃO [2]?ARMAZENAR ÍNDICES USANDO POSITIONS
_0.PRX
POSITIONSE PAYLOAD(TODO MUNDO ESQUECE DO PAYLOAD)
DOCUMENT #42
SOLUÇÃO [2]?ARMAZENAR ÍNDICES USANDO POSITIONS
A, B, C, E
A, C
A, D, E
.
.
.
0
1
2
SEGMENT
A: 42 (0, 1, 2, ...)
B: 42 (0, ...)
C: 42 (0, 1, ...)
D: 42 (2, ...)
E: 42 (0, 2, ...)
INDEX
SOLUÇÃO [2]?ARMAZENAR ÍNDICES USANDO POSITIONS
❖ ATÉ 1024 MENSAGENS POR DOCUMENTO
❖ SE < 64 MENSAGENS EM UM MESMO TERMO, USAR POSITIONS.
❖ SE > 64 MENSAGENS, ARMAZENAR UM BITSET COM 128 BYTES NO PAYLOAD (TAMBÉM NO PRX)POIS GERALMENTE CADA POSITION CONSOME 2 BYTES
❖ GARANTE MÁXIMO DE 128 BYTES / TERMO / DOCUMENTO. GERALMENTE MUITO MENOS.
A
B
SOLUÇÃO [2]?É NECESSÁRIO REIMPLEMENTAR A BUSCA
A AND B
53 55 63 68 78 80 88... ...
44 45 47 68 88 95 98... ...
SOLUÇÃO [2]?É NECESSÁRIO REIMPLEMENTAR A BUSCA
A AND B
68
68
A
B
1 5 10
1 2 5
68A&B 1 5
13
ORDENAÇÃO PARCIALTOP 1000 FROM 400,000,000
HEAP SELECTO(n log k) TEMPOO(k) MEMÓRIA
ORDENAÇÃO PARCIALTOP 1000 FROM 400,000,000
HEAP SELECTO(n log k) TEMPOO(k) MEMÓRIA
QUICK SELECTO(n) TEMPO
O(n) MEMÓRIA
CONCLUSÃOJÁ TOMEI TEMPO DEMAIS DE VOCÊS
Bibliotecas são feitas de forma genérica para atender razoavelmente o máximo de casos.
Ás vezes, para permitir grandes volumes sem uma infraestrutura colossal, é preciso entender como customizar a ferramenta para suas necessidades.
PERGUNTAS?
ENQUANTO ISSO, LINKS:juanlopes.net/qconrio2015
twitter.com/juanplopesgithub.com/juanplopes