cloud search avancado

Post on 25-Jul-2015

191 Views

Category:

Software

6 Downloads

Preview:

Click to see full reader

TRANSCRIPT

São Paulo

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

Agenda• Busca

• Configuração / Preparo

• Escalabilidade

• Consultas

• Arquitetura

• SCUP

Busca

Busca em Geral

Dados

Consulta Engajamento

Resultados

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

Dica #1

Migre para a API 2013

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

Configuração / Preparo

Amazon

CloudSearch

Crie batches

Proteja seu domínio

Consultas

Carga

Monitore seu domínio

Crie seu domínio

Configuração e Preparo

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

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

Dica #2

Faça uso de batches sempre

que possível

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)

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}

Dica #3

Proteja e monitore seu domínio

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

Proteja seu domínio por usuário

{

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

"Statement": [{

"Effect": "Allow",

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

"Action": ["cloudsearch:search",

"cloudsearch:suggest"

]

}

]

}

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"

}

]

}

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"

},

Escalabilidade

Dica #4

Aumente o tipo de instância

quando precisar indexar uma

carga grande de documentos

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

Escalando por volume de dados

SmallLarge

XLarge

2XLarge2XLarge

(P1)

2XLarge

(P2)

Aumento no volume de dados

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

Compressão dos índices

Documentos

Origem

Índice Nós do Amazon

CloudSearch

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%

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

Exemplo

150 GB

Dados

64 GB RAM

search.m2.2xlarge

3 Partições de m2.2xlarge

27 threads (no máximo)

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

Dica #5

Faça pré-aquecimento para

picos de acesso

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

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

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

Consultas

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

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

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']}

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

Dica #6

Utilize o parâmetro de filtragem

(fq) sempre que possível

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

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

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

Suporte a Múltiplos Idiomas

Suporte a Múltiplos Idiomas

Dica #7

Use o AWS SDK ou CLI para

consultar o CloudSearch

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

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

Arquitetura

Dica #8

Use Cache para Melhorar a

Performance e Diminuir os

Custos

Arquitetura com Cache

Amazon

ElastiCache

Amazon

CloudSearch

Application

servers

1

2, 5

3

4

Dica #9

Crie arquiteturas multi-tenancy

(para “múltiplos vizinhos”)

Dados Heterogêneos

Cliente 1 Cliente 2 Cliente 3

Idioma 1 Idioma 2 Idioma 3

Tipo 1 Tipo 2 Tipo 3

Solução 1 – Domínio Único

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

fq=customer_id:'12d4efd56'

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

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

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

Dica #10

Minere comportamento do

usuário para aprimorar os

resultados da busca

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

O Que é Possível Fazer com Comportamento

de Usuário?

• Boosting de documentos

• Enriquecimento de documentos

• Criação de sinônimos

• Etc…

• 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

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

• 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

• 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

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

• 300 milhões de documentos

• 400 mil queries / dia

• 300 mil indexações / dia

• 17 instâncias search.m2.2xlarge

CloudSearch no Scup

• 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

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

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

São Paulo

top related