cloud search avancado

70
São Paulo

Upload: amazon-web-services-latin-america

Post on 25-Jul-2015

191 views

Category:

Software


6 download

TRANSCRIPT

Page 1: Cloud search avancado

São Paulo

Page 2: Cloud search avancado

Amazon CloudSearch Avançado

Fábio Aragão da Silva, Solutions Architect at AWS

David Lojudice Sb, Chief Technology Officer at SCUP

28 de Maio de 2015

Page 3: Cloud search avancado

Agenda• Busca

• Configuração / Preparo

• Escalabilidade

• Consultas

• Arquitetura

• SCUP

Page 4: Cloud search avancado

Busca

Page 5: Cloud search avancado

Busca em Geral

Dados

Consulta Engajamento

Resultados

Page 6: Cloud search avancado

Busca no Amazon CloudSearch

• Disponibilizado a partir do motor A9

• Clientes pediram mais funcionalidades

• Primeiro passo: Apache Solr como novo motor

de busca

• A missão: gerenciar os detalhes operacionais

Page 7: Cloud search avancado

Dica #1

Migre para a API 2013

Page 8: Cloud search avancado

API 2013 do CloudSearch

• Mais funcionalidades e desenvolvimentocontínuo

• Custo mais baixo

• Suporte a muitas funcionalidades do Solr– Mais tipos de dados: float, date, geo, signed integer

– Múltiplas línguas

– Funcionalidades de UI: Highlighting, sugestões

– Funcionalidades do Solr: boosting, fuzzy, sloppy phrases

– Funcionalidades Operacionais: IAM, CLI, escalabilidade

Page 9: Cloud search avancado

Configuração / Preparo

Page 10: Cloud search avancado

Amazon

CloudSearch

Crie batches

Proteja seu domínio

Consultas

Carga

Monitore seu domínio

Crie seu domínio

Configuração e Preparo

Page 11: Cloud search avancado

Criando e Configurando um Domínio

aws cloudsearch create-domain

--domain-name twitter-sm

aws cloudsearch define-index-field

--domain-name twitter-sm

--name text

--type text

aws cloudsearch define-index-field

--domain-name twitter-sm

--name hashtags

--type literal-array

aws cloudsearch define-index-field

--domain-name twitter-sm

--name timestamp_ms --type int

etc...

Page 12: Cloud search avancado

Convertendo Dadosdef _convert_tweet(r):

clean_r = _clean_record(r) # remove bad Unicode

doc = sdf.SDFDoc()

doc.docid = clean_r['id'] # Identify the document's ID

# Process document sub-parts

if clean_r.has_key('entities'):

_parse_and_add_entities(clean_r, doc)

if clean_r.has_key('user'):

_parse_and_add_user_data(clean_r, doc)

# Remove unwanted portions of the source data

if clean_r.has_key('retweeted_status'):

clean_r.pop('retweeted_status', None)

if clean_r.has_key('sizes'):

clean_r.pop('sizes', None)

doc.add_fields(**clean_r)

return doc

Page 13: Cloud search avancado

Dica #2

Faça uso de batches sempre

que possível

Page 14: Cloud search avancado

Criando Batches

for filename in dirwalk(sourcedir): # Or streaming, or DB, or...

with open(filename, 'r') as f:

for l in f:

batch.add_doc(_convert_tweet(l))

if batch.size > sdf_size:

flush_batch(batch)

Page 15: Cloud search avancado

Usando a AWS CLI para fazer upload

aws cloudsearchdomain upload-documents

--documents <filename>

--endpoint 'http://<doc endpoint>'

--content-type 'application/json'

{

"status": "success",

"adds": 5684,

"deletes": 0}

Page 16: Cloud search avancado

Dica #3

Proteja e monitore seu domínio

Page 17: Cloud search avancado

Boas práticas de segurança

• Controle de forma cuidadosa o acesso aoserviço de documento (indexação)

• Os serviços de busca e sugestão necessitam de acesso mais amplo

• Utilize políticas de acesso diferentes paradiferentes classes de usuários administrativos

Page 18: Cloud search avancado

Proteja seu domínio por usuário

{

"Version": "2012-10-17",

"Statement": [{

"Effect": "Allow",

"Principal": {"AWS": ["*"]},

"Action": ["cloudsearch:search",

"cloudsearch:suggest"

]

}

]

}

Page 19: Cloud search avancado

Proteja seu domínio por recurso

{

"Version": "2012-10-17",

"Statement": [{

"Effect": "Allow",

"Action": ["cloudsearch:search", "cloudsearch:document"],

"Resource": "arn:aws:cloudsearch:us-east-1:111122223333:domain/tweets"

}

]

}

Page 20: Cloud search avancado

Integração com AWS CloudTrail• Describe*

• Update*

• Delete*

AWS CloudTrail

{

"eventVersion": "1.01",

"userIdentity": {"type": "Root", "principalId": "...", "arn": "...", "accountId": "...", "accessKeyId":

"..."},

"eventTime": "2014-10-27T20:53:07Z",

"eventSource": "cloudsearch.amazonaws.com",

"eventName": "DescribeDomains",

"awsRegion": "us-east-1",

"sourceIPAddress": "...",

"userAgent": "aws-sdk-java/Linux/2.6.18-164.el5 Java_HotSpot(TM)_64-Bit/23.25-b01/1.7.0_25",

"requestParameters": {"domainNames": ["twitter-geo"]},

"responseElements": null,

"requestID": "40d6953b-5e1b-11e4-ae8f-97e54e307088",

"eventID": "9835fa54-b8d3-4fb0-ac6e-ef1403069f7b"

},

Page 21: Cloud search avancado

Escalabilidade

Page 22: Cloud search avancado

Dica #4

Aumente o tipo de instância

quando precisar indexar uma

carga grande de documentos

Page 23: Cloud search avancado

Escalando o CloudSearch

• Escale pra cima para suportar a carga/indexação inicial

• Volte ao tamanho adequado para o tráfegonormal

• Faça pré-aquecimento para aumentos previstosde tráfego

Page 24: Cloud search avancado

Escalando por volume de dados

SmallLarge

XLarge

2XLarge2XLarge

(P1)

2XLarge

(P2)

Aumento no volume de dados

Page 25: Cloud search avancado

E quão grande?

Tipo de InstânciaDados do Twitter

(apenas a busca)

Dados do Common-crawl

(apenas a busca)

search.m1.small6.7 GB, 4.7 milhões de

documentos

4 GB, 625 mil

documentos

search.m1.large26.8 GB, 18.8 milhões

de documentos

16 GB, 2.5 milhões de

documentos

search.m2.xlarge53.6 GB, 37.6 milhões

de documentos

34 GB, 5 milhões de

documentos

search.m2.2xlarge*107.2 GB, 75.2 milhões

de documentos

64 GB, 10 milhões de

documentos

Page 26: Cloud search avancado

Compressão dos índices

Documentos

Origem

Índice Nós do Amazon

CloudSearch

Page 27: Cloud search avancado

Tamanho dos índices

Nenhum

opção

Todas as

opçõesHighlight Retorno Ordenação Faceta

Partições 5 2xl 7 2xl 7 2xl 5 2xl 5 2xl 5 2xl

Aumento 0% 243% 220.8% 153.2% 12.7% 0.3%

Page 28: Cloud search avancado

Indexação multi-thread

Tipo da Instância Threads da Instância Threads de Conexão

search.m1.small 2 1

search.m1.large 5 3

search.m2.xlarge 9 5

search.m2.2xlarge* 17 9

Page 29: Cloud search avancado

Exemplo

150 GB

Dados

64 GB RAM

search.m2.2xlarge

3 Partições de m2.2xlarge

27 threads (no máximo)

Page 30: Cloud search avancado

Processo de carga de dadosaws cloudsearch update-scaling-parameters

--domain-name foo

--scaling-parameters DesiredInstanceType=search.m2.2xlarge, DesiredPartitionCount=3

aws cloudsearch index-documents

--domain-name foo

E após carregar os dados...

aws cloudsearch update-scaling-parameters

--domain-name foo

--scaling-parameters DesiredInstanceType=search.m1.small, DesiredPartitionCount=1

Page 31: Cloud search avancado

Dica #5

Faça pré-aquecimento para

picos de acesso

Page 32: Cloud search avancado

Escalando a partir de consultas

search request

volume and complexity

SEARCH INSTANCE

Index Partition 1Replica 1

SEARCH INSTANCE

Index Partition 2Replica 1

SEARCH INSTANCE

Index Partition nReplica 1

SEARCH INSTANCE

Index Partition 1Replica 2

SEARCH INSTANCE

Index Partition 2Replica 2

SEARCH INSTANCE

Index Partition nReplica 2

SEARCH INSTANCE

Index Partition 1Replica n

SEARCH INSTANCE

Index Partition 2Replica n

SEARCH INSTANCE

Index Partition nReplica n

Page 33: Cloud search avancado

Escalando a partir de consultas

Tipo de Instância Threads JMeterThroughput

do Twitter

Throughput

da Common Crawl

search.m1.small 202 hosts

10 threads

25.1 qps

397 ms

48.3 qps

206 ms

search.m1.large 204 hosts

20 threads

108.5 qps

183 ms

291.5 qps

68 ms

search.m2.xlarge 208 hosts

40 threads

419.6 qps

94 ms

665.9 qps

59 ms

search.m2.2xlarge 2016 hosts

80 threads

566.4 qps

140 ms

985.3 qps

80 ms

Page 34: Cloud search avancado

30 qps20 qps10 qps5 qps60 qps

Index Partition 1Replica 3

SEARCH m1.small

Exemplo

????

? ??

????

? ??

????

? ??????

? ?????

?

? ??

????

? ??

SEARCH.m1.smallIndex Partition 1

Replica 1

SEARCH.m1.smallIndex Partition 1

Replica 2

SEARCH m1.small

Index Partition 1Replica 1

SEARCH m1.small

Index Partition 1Replica 2

SEARCH m1.small

Index Partition 1Replica 1

??

?

40 qps50 qps

Page 35: Cloud search avancado

Consultas

Page 36: Cloud search avancado

Consultas Simples

{"status": { "rid": "i8TQupgpEQocRhU=","time-ms": 3},

"hits": {"found": 9234, "start": 0,

"hit": [

{

"id": "523254764427952129",

"fields": {

"text": "idk if its yummy or what lol im hungry"

}

},...

http://<endpoint>/2013-01-01/search?q=idk

Page 37: Cloud search avancado

Consultas Estruturadas

{"status": { "rid": "lPfcupgpFAocRhU=","time-ms": 4},

"hits": {"found": 6235, "start": 0,

"hit": [

{

"id": "523260481096540160",

"fields": {

"text": "idk what it is but ... something's different"

}

},...

http://<endpoint>/2013-01-01/search?q=(and 'idk'

country:'United States')&q.parser=structured

Page 38: Cloud search avancado

Outras Opções de Consulta

{"status": { "rid": "9MPvupgpFwocRhU=","time-ms": 2},

"hits": {"found": 8997, "start": 0,

"hit": [

{

"id": "523303605575909376",

"fields": {

"text": "Idk ... Idk idk idk idk idk idk"

}

},...

http://<endpoint>/2013-01-01/search?q=idk

&q.parser=structured&q.options={fields:['text^4','us

er_description^0.5']}

Page 39: Cloud search avancado

Filtro Geográfico

{"status": { "rid": "+r6Wh5gpBgocRhU=","time-ms": 2},

"hits": {"found": 78, "start": 0,

"hit": [

{

"id": "523341488005345280",

"fields": {

"text": "I love talking baseball with my dad"

}

},...

fq=geo:['37.8324,-122.3553','37.6040,-123.0137']&

q='baseball'&q.parser=structured&return=text

Page 40: Cloud search avancado

Dica #6

Utilize o parâmetro de filtragem

(fq) sempre que possível

Page 41: Cloud search avancado

Filtro versus Consulta

• Filtros não contribuempara o ranqueamento

• Filtros podem sermais rápidos

• Filtros suportamlinguagem estruturadade consulta Times include HTTP transport

0

50

100

150

200

250

q= fq= fq=(10Queries)

TotalQ

ueryLatency,M

illiseconds

QueryCondi on

p50

Average

p90

Page 42: Cloud search avancado

Ordenação Geográfica

{"status": { "rid": "+vtjHjJgpDwocRhU=","time-ms": 41},

"hits": {"found": 78, "start": 0,

"hit": [

{

"id": "523310760416378881",

"fields": {

"text": "Still can't believe it! What a game!

@sfgiants #worldseries @ AT&amp;T Park http://t.co/TTNP7CPHHP"

}

},...

expr.dist=haversin(37.7786,-122.3892,geo.latitude,geo.longitude)&sort=dist asc&

q='baseball'&q.parser=structured&return=text

Page 43: Cloud search avancado

Boosting

baseball

(or 'baseball' (term field='hashtags' boost=4 'sfgiants'))

• Great Day of Baseball here at the Junior Fall Classic

• Good Morning! Fall #Baseball. #HuntingtonPark

• Beautiful Saturday morning for baseball in Norfolk.

• A day off. Pretty nice to have one sometimes. No teaching, no #baseball

• One word to describe 9th inning....baseball. #SFGiants

• I'm on a #SFGiants high. Listening to analysis...

• @RealTimers @thejoelsteinUnless it's #SFGiants...

• Apropos of nothing: #SFGiants are in the Big Show again...

Page 44: Cloud search avancado

Suporte a Múltiplos Idiomas

Page 45: Cloud search avancado

Suporte a Múltiplos Idiomas

Page 46: Cloud search avancado

Dica #7

Use o AWS SDK ou CLI para

consultar o CloudSearch

Page 47: Cloud search avancado

Usando o AWS SDK

AmazonCloudSearchDomainClient client =

new AmazonCloudSearchDomainClient(

new ProfileCredentialsProvider("user_profile”));

client.setEndpoint(endpoint);

SearchRequest search = new SearchRequest();

search.setQuery(query);

SearchResult results = client.search(search);

Page 48: Cloud search avancado

Usando a AWS CLI

{"status": { "rid": "wdzc35cpBgoupzc=","time-ms": 4},

"hits": {"found": 20622, "start": 0,

"hit": [

{

"id": "523897644771733504",

"fields": {

"text": "idk if its yummy or what lol im hungry"

}

},...

$ aws cloudsearchdomain search --search-query

'idk' --endpoint 'http://<endpoint>/'

Page 49: Cloud search avancado

Arquitetura

Page 50: Cloud search avancado

Dica #8

Use Cache para Melhorar a

Performance e Diminuir os

Custos

Page 51: Cloud search avancado

Arquitetura com Cache

Amazon

ElastiCache

Amazon

CloudSearch

Application

servers

1

2, 5

3

4

Page 52: Cloud search avancado

Dica #9

Crie arquiteturas multi-tenancy

(para “múltiplos vizinhos”)

Page 53: Cloud search avancado

Dados Heterogêneos

Cliente 1 Cliente 2 Cliente 3

Idioma 1 Idioma 2 Idioma 3

Tipo 1 Tipo 2 Tipo 3

Page 54: Cloud search avancado

Solução 1 – Domínio Único

..."customer_id":"12d4efd56"...

fq=customer_id:'12d4efd56'

Page 55: Cloud search avancado

Solução 2 – Múltiplos Domínios

http://endpoint1, http://endpoint2, http://endpoint3

Page 56: Cloud search avancado

Melhores Práticas

• Escolha a abordagem de domínio único quandoo número de vizinhos for grande

• Escolha a abordagem de múltiplos domíniosquando existe grande variação de escala ouconfiguração entre os vizinhos

• Escolha uma abordagem híbrida (quando fizersentido) para minimizar o custo e maximizar a performance

Page 57: Cloud search avancado

Dica #10

Minere comportamento do

usuário para aprimorar os

resultados da busca

Page 58: Cloud search avancado

Monitoramento do Comportamento de

Usuário

Servidores

de Aplicação

Amazon

Redshift

Informaçòes de Sessão

Consultas/Resultados

Cliques

Compras

Amazon

CooudSearch

Amazon

EMRBanco da

Aplicação

Processamento

Page 59: Cloud search avancado

O Que é Possível Fazer com Comportamento

de Usuário?

• Boosting de documentos

• Enriquecimento de documentos

• Criação de sinônimos

• Etc…

Page 60: Cloud search avancado
Page 61: Cloud search avancado

• Multinacional Brasileira

• 5 anos, Pioneira e Líder de Mercado

• Certificada pelo Facebook e pelo Twitter

• Parceira do Google+, Facebook e Twitter

• Presente em 40 das 100 MaioresEmpresas do Brasil*

“Queremos focar

nas

funcionalidades

desejadas pelos

clientes” David Lojudice, CTO do

Scup

Fonte: Revista Exame

Page 62: Cloud search avancado

• “Near real-time search”: buscaem documentos recém-indexados

• Mínimo esforço do time de DevOps.

• Volume crescente de buscas

• Volume crescente de indexação

O Desafio

Page 63: Cloud search avancado

• Solução Inicial (primeiro ano da empresa)

• Problemas:– Performance

– Não permitia filtros complexos

– Não escala

1a. Geração – MySQL Full Text

Search

Amazon EC2

Crawlers

Page 64: Cloud search avancado

• Entendemos que precisávamos de um search engine (segundo ano

da empresa)

• Problemas:– Não escala

– Instabilidade (índice corrompia)

– Demandava tempo significativo da equipe de DevOps

2a. Geração - Sphinx

Amazon EC2

Crawlers

Page 65: Cloud search avancado

• “Near real-time search”

• Escala (volume, buscas e indexação)

• Baixa demanda do time de DevOps.

3a. Geração - CloudSeach

Amazon RDS

MySQL

Amazon EC2

Crawlers

Amazon

CloudSearch

Page 66: Cloud search avancado

• 300 milhões de documentos

• 400 mil queries / dia

• 300 mil indexações / dia

• 17 instâncias search.m2.2xlarge

CloudSearch no Scup

Page 67: Cloud search avancado

• Migre para a API 2013

• Mais barato, melhor integração – AWS SDK, AWS CLI

• Use o máximo que puder de batches para obter a melhor performance durante indexações

• Escale manualmente quando for carregar dados de forma massiva e em picos de consulta

• Features do Solr possibilitam queries mais avançadas

• Crie domínios “multi-tenant”, use filtros, diferentesidiomas, etc.

Resumo

Page 68: Cloud search avancado

Leitura

• aws.amazon.com/documentation/cloudsearch/

Comunidade e suporte:

• awshub.com.br

• forums.aws.amazon.com

• aws.amazon.com/support

Treinamento

• qwiklabs.com/focuses/preview/1269

Próximos Passos

Page 69: Cloud search avancado

Fábio Aragão da Silva, Solutions Architect – AWS

Page 70: Cloud search avancado

São Paulo