Cloud search avancado
-
Upload
amazon-web-services-latin-america -
Category
Software
-
view
191 -
download
6
Transcript of Cloud search avancado
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&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