qconrio2015

Post on 28-Jan-2018

540 views 1 download

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

DOCUMENTOA UNIDADE BÁSICA DO LUCENE

SUBJECT Important! Don’t let this leakFROM 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 leakFROM 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

DOCUMENTOCADA TOKEN PRECISA ESTAR NORMALIZADO

DOCUMENTORESULTADO: 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

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.