qconrio2015

68

Transcript of qconrio2015

Page 1: qconrio2015
Page 2: qconrio2015

3,000,000,000 mensagens/dia

Page 3: qconrio2015

3,000,000,000 mensagens/dia

1 terabytepor dia

Page 4: qconrio2015

100,000,000,000mensagens de retenção no índice

3,000,000,000 mensagens/dia

1 terabytepor dia

Page 5: qconrio2015

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

Page 6: qconrio2015

LUCENE ESCALA?

Full-text para Big Data com

hardware modesto

@JUANPLOPES

TERM

TERM

TERM

TERMTERM

Page 7: qconrio2015

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

Page 8: qconrio2015

QUEM SOU EU?UMA PERGUNTA PROFUNDA

GITHUB.COM

TWITTER.COM

/JUANPLOPES

Page 9: qconrio2015
Page 10: qconrio2015
Page 11: qconrio2015

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

Page 12: qconrio2015

“fault tolerance”

40

ÍNDICE REMISSIVOQUERIES BOOLEANAS

41 43

“faixas de frequência”

40 43 45

Page 13: qconrio2015

ÍNDICE REMISSIVOQUERIES BOOLEANAS

“fault tolerance” OR “faixas de frequência”

40 43 4541

Page 14: qconrio2015

ÍNDICE REMISSIVOQUERIES BOOLEANAS

“fault tolerance” AND “faixas de frequência”

40 43

Page 15: qconrio2015

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

Page 16: qconrio2015

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

Page 17: qconrio2015

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

Page 18: qconrio2015

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

Page 19: qconrio2015

DOCUMENT

DOCUMENTORESULTADO: CAMPOS E TERMOS

Page 20: qconrio2015

DOCUMENT

INDEXWRITER

DOCUMENT #0

DOCUMENTOAO INDEXAR, RECEBE UM ID

Page 21: qconrio2015

SEGMENT #0

INDEX WRITERESCREVE UM SEGMENTO POR VEZ

Page 22: qconrio2015

SEGMENT #0

INDEX WRITERESCREVE UM SEGMENTO POR VEZ

X #0

TERM_1: #0

TERM_3: #0

TERM_4: #0

Page 23: qconrio2015

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

Page 24: qconrio2015

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

Page 25: qconrio2015

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

Page 26: qconrio2015

SEGMENT #1

INDEX WRITERESCREVE UM SEGMENTO POR VEZ

#0

Page 27: qconrio2015

SEGMENTOSSÃO IMUTÁVEIS. MESMO.

-010 docs

Page 28: qconrio2015

-1

SEGMENTOSSÃO IMUTÁVEIS. MESMO.

10 docs

Page 29: qconrio2015

SEGMENTOSSÃO IMUTÁVEIS. MESMO.

-110 docs

-033 docs

Page 30: qconrio2015

SEGMENTOSSÃO IMUTÁVEIS. MESMO.

-019 docs

-310 docs

-533 docs

Page 31: qconrio2015

SEGMENTOSCADA SEGMENTO É UM PEQUENO ÍNDICE

INDEXREADER

INDEXREADER

INDEXREADER

-019 docs

-310 docs

-533 docs

COMPOSITEREADER

Page 32: qconrio2015

SEGMENTOSID DO DOCUMENTO MUDA POR READER

-019 docs

-310 docs

-533 docs

INDEXREADER

-862 docs

0..9

10..42

43..61

0..61

Page 33: qconrio2015

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

Page 34: qconrio2015

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

Page 35: qconrio2015

SEGMENTOSÁS VEZES É PRECISO FAZER MERGE

-090 docs -887 docs -144 docs -041 docs

-033 docs -430 docs -025 docs -022 docs

-030 docs

Page 36: qconrio2015

SEGMENTOSA ANATOMIA DO SEGMENTO #0

_0.FNM

_0.FDX

_0.TIM

_0.TIP

_0.FRQ

_0.PRX

_0.FDT

_0.DEL

_0.NRM

Page 37: qconrio2015

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

Page 38: qconrio2015

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

Page 39: qconrio2015

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

Page 40: qconrio2015

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

Page 41: qconrio2015

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

Page 42: qconrio2015

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

Page 43: qconrio2015

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

Page 44: qconrio2015

_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

Page 45: qconrio2015

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

Page 46: qconrio2015

FILE FORMATPRECISAMOS FALAR DE BYTES(BEM DE LEVE)

TERM_2 2 3 5 6 7 9 12 13

TERM_3

TERM_1Docs

Page 47: qconrio2015

FILE FORMATPRECISAMOS FALAR DE BYTES(BEM DE LEVE)

TERM_2 2 1 2 1 1 2 3 1

TERM_3

TERM_1DocDeltas

Page 48: qconrio2015

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

Page 49: qconrio2015

FILE FORMATVENI VIDI V-INT

32-BIT LITTLE ENDIAN INT

= 123,456,789

= 1

Page 50: qconrio2015

32-BIT V-INT

FILE FORMATVENI VIDI V-INT

= 123,456,789

= 1

= 128

Page 51: qconrio2015

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

Page 52: qconrio2015

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

Page 53: qconrio2015

VAMOS FALAR DE DESAFIOS?PRODUÇÃO, AINDA TEM TEMPO?

Page 54: qconrio2015

PROBLEMASFALANDO EM INTEIROS

DOCID :: INT32i.e.

DOCID < 2,147,483,648

Page 55: qconrio2015

_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

Page 56: qconrio2015

PROBLEMAS100% DE OVERHEAD DE ÍNDICE? NEM PENSAR!

LUCENEINDEX

RAW STORAGE

ID

APIQUERY

MSGS

Page 57: qconrio2015

SOLUÇÃO?AGRUPAR MENSAGENS

DOCUMENT

MSG

MSG

MSG

MSG

MSG

MSG

Page 58: qconrio2015

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”

Page 59: qconrio2015

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.

Page 60: qconrio2015

SOLUÇÃO [2]?ARMAZENAR ÍNDICES USANDO POSITIONS

_0.PRX

POSITIONSE PAYLOAD(TODO MUNDO ESQUECE DO PAYLOAD)

Page 61: qconrio2015

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

Page 62: qconrio2015

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.

Page 63: qconrio2015

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

Page 64: qconrio2015

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

Page 65: qconrio2015

ORDENAÇÃO PARCIALTOP 1000 FROM 400,000,000

HEAP SELECTO(n log k) TEMPOO(k) MEMÓRIA

Page 66: qconrio2015

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

Page 67: qconrio2015

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.