SlideShare uma empresa Scribd logo
qconrio2015
3,000,000,000
mensagens/dia
3,000,000,000
mensagens/dia
1 terabyte
por dia
100,000,000,000
mensagens de retenção no índice
3,000,000,000
mensagens/dia
1 terabyte
por dia
3,000,000,000
mensagens/dia
1 terabyte
por dia
100,000,000,000
mensagens de retenção no índice
3 máquinas
8GB de RAM em cada
LUCENE ESCALA?
Full-text para Big Data com
hardware modesto
@JUANPLOPES
TERM
TERM
TERM
TERM
TERM
QUEM SOU EU?
UMA PERGUNTA PROFUNDA
PAI DO MIGUEL
GERENTE DE PAPINHAS
SUPERVISOR DE BRINCADEIRAS
PROGRAMADOR @INTELIE
MAGO DOS COMPILADORES
CO-DIRETOR DE TRETAS CORPORATIVAS
MESTRANDO @IME/UERJ
CIÊNCIAS COMPUTACIONAIS
VICIADO EM COMPETIÇÕES DE PROGRAMAÇÃO
QUEM SOU EU?
UMA PERGUNTA PROFUNDA
GITHUB.COM
TWITTER.COM
/JUANPLOPES
qconrio2015
qconrio2015
F
faixas de frequência 40, 43, 45
FAT 17
fault tolerance 40, 41, 43
FCC 17, 45
fibra óptica 41, 43
G
gateway 41, 99
ÍNDICE REMISSIVO
POUCA GENTE USA, MAS É ÚTIL
40 41 43 45
17
99
“fault tolerance”
40
ÍNDICE REMISSIVO
QUERIES BOOLEANAS
41 43
“faixas de frequência”
40 43 45
ÍNDICE REMISSIVO
QUERIES BOOLEANAS
“fault tolerance” OR “faixas de frequência”
40 43 4541
ÍNDICE REMISSIVO
QUERIES BOOLEANAS
“fault tolerance” AND “faixas de frequência”
40 43
SUBJECT Important! Don’t let this leak
FROM John Doe <john.doe@mail.com>
TO Alice Legit <alice@legit.com>,
Bob Legit <bob@legit.com>
BCC Eve Eavesdropper <eve@hacker.io>
BODY
Here is the password: pa$$word
DOCUMENTO
A UNIDADE BÁSICA DO LUCENE
SUBJECT Important! Don’t let this leak
FROM John Doe <john.doe@mail.com>
TO Alice Legit <alice@legit.com>,
Bob Legit <bob@legit.com>
BCC Eve Eavesdropper <eve@hacker.io>
BODY
Here is the password: pa$$word
DOCUMENTO
É PRECISO SEPARAR OS CAMPOS EM TOKENS
SUBJECT important! dont let this leak
FROM john doe <john.doe@mail.com>
TO alice legit <alice@legit.com>,
bob legit <bob@legit.com>
BCC eve eavesdropper <eve@hacker.io>
BODY
here is the password: pa$$word
DOCUMENTO
CADA TOKEN PRECISA ESTAR NORMALIZADO
DOCUMENTO
RESULTADO: CAMPOS E TERMOS
FROM doe, john, johndoe@mail.com
TO alice, alice@legit.com, bob, bob@legit.com, legit
BCC eavesdropper, eve, eve@hacker.io
SUBJECT dont, leak, let, this
BODY here, password
DOCUMENT
DOCUMENTO
RESULTADO: CAMPOS E TERMOS
DOCUMENT
INDEX
WRITER
DOCUMENT #0
DOCUMENTO
AO INDEXAR, RECEBE UM ID
SEGMENT #0
INDEX WRITER
ESCREVE UM SEGMENTO POR VEZ
SEGMENT #0
INDEX WRITER
ESCREVE UM SEGMENTO POR VEZ
X #0
TERM_1: #0
TERM_3: #0
TERM_4: #0
SEGMENT #0
INDEX WRITER
ESCREVE 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 WRITER
ESCREVE 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 WRITER
ESCREVE 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 WRITER
ESCREVE UM SEGMENTO POR VEZ
#0
SEGMENTOS
SÃO IMUTÁVEIS. MESMO.
-010 docs
-1
SEGMENTOS
SÃO IMUTÁVEIS. MESMO.
10 docs
SEGMENTOS
SÃO IMUTÁVEIS. MESMO.
-110 docs
-033 docs
SEGMENTOS
SÃO IMUTÁVEIS. MESMO.
-019 docs
-310 docs
-533 docs
SEGMENTOS
CADA SEGMENTO É UM PEQUENO ÍNDICE
INDEX
READER
INDEX
READER
INDEX
READER
-019 docs
-310 docs
-533 docs
COMPOSITE
READER
SEGMENTOS
ID DO DOCUMENTO MUDA POR READER
-019 docs
-310 docs
-533 docs
INDEX
READER
-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
SEGMENTOS
A 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
SEGMENTOS
A ANATOMIA DO SEGMENTO #0
_0.
FNM
FNM: FIELD NAMES
Manté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
SEGMENTOS
A ANATOMIA DO SEGMENTO #0
DEL: DELETED DOCS
Arquivo 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
SEGMENTOS
A ANATOMIA DO SEGMENTO #0
THE POSTINGS FORMAT
Sã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
SEGMENTOS
A ANATOMIA DO SEGMENTO #0
_0.
TIM
_0.
TIP
TIM E TIP: TERM INDEX
Armazenam 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
SEGMENTOS
A ANATOMIA DO SEGMENTO #0
FRQ: FREQUENCIES
Armazenam 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
SEGMENTOS
A ANATOMIA DO SEGMENTO #0
PRX: POSITIONS
Opcional. 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
SEGMENTOS
A ANATOMIA DO SEGMENTO #0
FDX E FDT: STORED FIELDS
Armazena 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
SEGMENTOS
A ANATOMIA DO SEGMENTO #0
NRM: NORMS
Armazena 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.
SEGMENTOS
TERM VECTORS CONSIDERED HARMFUL
_0.
TVD
_0.
TVX
_0.
TVF
FILE FORMAT
PRECISAMOS FALAR DE BYTES
(BEM DE LEVE)
TERM_2 2 3 5 6 7 9 12 13
TERM_3
TERM_1
Docs
FILE FORMAT
PRECISAMOS FALAR DE BYTES
(BEM DE LEVE)
TERM_2 2 1 2 1 1 2 3 1
TERM_3
TERM_1
DocDeltas
FILE FORMAT
PRECISAMOS FALAR DE BYTES
(BEM DE LEVE)
TERM_2 2 1 2 1 1 2 3 1
TERM_3
TERM_1
Não vi vantagem.
Ainda são 32 bits!
DocDeltas
FILE FORMAT
VENI VIDI V-INT
32-BIT LITTLE ENDIAN INT
= 123,456,789
= 1
32-BIT V-INT
FILE FORMAT
VENI VIDI V-INT
= 123,456,789
= 1
= 128
FILE FORMAT
VENI 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ÇO
MENOS I/O
DESVANTAGENS
IMPOSSÍVEL ITERAR AO CONTRÁRIO
DIFÍCIL ACESSO ALEATÓRIO
MAIOR CUSTO DE PROCESSAMENTO
FILE FORMAT
VENI VIDI V-INT
VAMOS FALAR DE DESAFIOS?
PRODUÇÃO, AINDA TEM TEMPO?
PROBLEMAS
FALANDO EM INTEIROS
DOCID :: INT32
i.e.
DOCID < 2,147,483,648
_0.
FDX
_0.
TIM
_0.
TIP
_0.
FRQ
_0.
PRX
_0.
FDT
PROBLEMAS
O QUE CRESCE NO ÍNDICE?
TERM INDEX
TERMO EM UTF8
+ BYTES CONSTANTES / TERMO
FREQUENCIES AND POSITIONS
~2 BYTES / TERMO DISTINTO / DOCUMENTO
A PRINCÍPIO, SEM POSITIONS
STORED FIELDS
SOMENTE ID, 16 BYTES / DOCUMENTO
+ OVERHEAD 8 BYTES / DOCUMENTO
PROBLEMAS
100% DE OVERHEAD DE ÍNDICE? NEM PENSAR!
LUCENE
INDEX
RAW
STORAGE
ID
API
QUERY
MSGS
SOLUÇÃO?
AGRUPAR MENSAGENS
DOCUMENT
MSG
MSG
MSG
MSG
MSG
MSG
SOLUÇÃO?
AGRUPAR MENSAGENS
VANTAGENS
MENOS TERMOS DISTINTOS
MENOR OVERHEAD COM STORED FIELDS
MENOS DOCIDs
ÍNDICE MENOR (MENOS I/O)
DESVANTAGENS
OVERHEAD DE FILTRO PÓS QUERY
SEM QUERIES “AND” E “NOT”
SOLUÇÃO?
TEM UM PROBLEMÃO
TERMS:
A, B, C
A, B B, CA AND C
→ TRUE
ERRADO: Deveria ser false,
pois nenhuma mensagem
individual contém A e C.
A AND NOT C
→ FALSE
ERRADO: 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
POSITIONS
E 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 PARCIAL
TOP 1000 FROM 400,000,000
HEAP SELECT
O(n log k) TEMPO
O(k) MEMÓRIA
ORDENAÇÃO PARCIAL
TOP 1000 FROM 400,000,000
HEAP SELECT
O(n log k) TEMPO
O(k) MEMÓRIA
QUICK SELECT
O(n) TEMPO
O(n) MEMÓRIA
CONCLUSÃO
JÁ 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/juanplopes
github.com/juanplopes

Mais conteúdo relacionado

PPTX
Código de Huffman
PDF
qconsp2015
PDF
postgres servlab
PPT
Super Show do Leão - Hardware
PPTX
Compressão de Índices
DOCX
PPTX
Tradutor de Pig Latin
PDF
Criptografia
Código de Huffman
qconsp2015
postgres servlab
Super Show do Leão - Hardware
Compressão de Índices
Tradutor de Pig Latin
Criptografia

Semelhante a qconrio2015 (20)

PDF
Apostila01 - aplicacoes em redes
PDF
ITI Slides
PDF
34 tutorial sobre rede cabos - grimpagem - hub-switch
PDF
O que você acha que sabe sobre banco de dados
PDF
PPTX
Módulo 5 Arquitetura de Computadores
PPT
Gerador de Código-Objeto - Compiladores
PDF
PCF03 - 2001 Comentada
PPT
O DATACENTER virou um software !
PDF
Apostila de montagem e manutenção de computadores emi mario gurgel
PPTX
Novidades do CAT3D em 2014
PDF
Apostila etec banco
DOCX
modulo-15-sql-criar-e-manipular-tabelas1-2-flipbook-pdf.docx
PDF
Ed 2970-1100
PDF
Ed 2970-1100
PDF
Leitores DS3500-er
PDF
PPTX
MQTT Intro - Spañol caracteristicas y especificaciones
KEY
Programação Orientada a Testes
PDF
Revisão de linguagem C para Sistemas Embarcados
Apostila01 - aplicacoes em redes
ITI Slides
34 tutorial sobre rede cabos - grimpagem - hub-switch
O que você acha que sabe sobre banco de dados
Módulo 5 Arquitetura de Computadores
Gerador de Código-Objeto - Compiladores
PCF03 - 2001 Comentada
O DATACENTER virou um software !
Apostila de montagem e manutenção de computadores emi mario gurgel
Novidades do CAT3D em 2014
Apostila etec banco
modulo-15-sql-criar-e-manipular-tabelas1-2-flipbook-pdf.docx
Ed 2970-1100
Ed 2970-1100
Leitores DS3500-er
MQTT Intro - Spañol caracteristicas y especificaciones
Programação Orientada a Testes
Revisão de linguagem C para Sistemas Embarcados
Anúncio

Mais de Juan Lopes (9)

PDF
PIPES: Uma linguagem para processamento distribuído de eventos complexos
PDF
devday2013
PDF
dnarj20130504
PDF
uerj201212
PDF
devday2012
PDF
rioinfo2012
PDF
tdc2012
PDF
dnarj-20120630
PDF
dnad12
PIPES: Uma linguagem para processamento distribuído de eventos complexos
devday2013
dnarj20130504
uerj201212
devday2012
rioinfo2012
tdc2012
dnarj-20120630
dnad12
Anúncio

Último (9)

PDF
SLIDES - AULA 2 - INTRODUÇÃO - Material de Cleyton Souza - IFPB
PPT
05_slide especificacao de sistemas de software e a uml UML.ppt
PDF
SLIDES - AULA 1 - APRESENTAÇÃO - Material de Cleyton Souza - IFPB
PDF
SLIDES - AULA 7 - SWING - Cleyton Souza - IFPB
PPT
06_slide de Arquitetura_de_Software .ppt
PPT
09_Evolucao de software e_Refatoracao.ppt
PDF
SLIDES - AULA 3 - CLASSES E OBJETOS EM JAVA - Material de Cleyton Souza - IFPB
PDF
SLIDES - AULA 5 - HERANÇA - Material de Cleyton Souza - IFPB
PPT
03_slide de Gerenciamento de Projetos .ppt
SLIDES - AULA 2 - INTRODUÇÃO - Material de Cleyton Souza - IFPB
05_slide especificacao de sistemas de software e a uml UML.ppt
SLIDES - AULA 1 - APRESENTAÇÃO - Material de Cleyton Souza - IFPB
SLIDES - AULA 7 - SWING - Cleyton Souza - IFPB
06_slide de Arquitetura_de_Software .ppt
09_Evolucao de software e_Refatoracao.ppt
SLIDES - AULA 3 - CLASSES E OBJETOS EM JAVA - Material de Cleyton Souza - IFPB
SLIDES - AULA 5 - HERANÇA - Material de Cleyton Souza - IFPB
03_slide de Gerenciamento de Projetos .ppt

qconrio2015