O Amazon CloudSearch é um serviço gerenciado de buscas em larga escala. É a mesma funcionalidade disponível no site da amazon.com, disponível tambem para a sua empresa. Nesta apresentação avançada, exploramos o CloudSearch e a sua integração com diversas ferramentas, e arquiteturas de uso.
2. 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
6. 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
8. API 2013 do CloudSearch
• Mais funcionalidades e desenvolvimento
contí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
11. 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...
12. Convertendo Dados
def _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
14. 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)
15. 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
}
17. Boas práticas de segurança
• Controle de forma cuidadosa o acesso ao
serviço de documento (indexação)
• Os serviços de busca e sugestão necessitam de
acesso mais amplo
• Utilize políticas de acesso diferentes para
diferentes classes de usuários administrativos
22. Dica #4
Aumente o tipo de instância
quando precisar indexar uma
carga grande de documentos
23. Escalando o CloudSearch
• Escale pra cima para suportar a
carga/indexação inicial
• Volte ao tamanho adequado para o tráfego
normal
• Faça pré-aquecimento para aumentos previstos
de tráfego
24. Escalando por volume de dados
Small
Large
XLarge
2XLarge
2XLarge
(P1)
2XLarge
(P2)
Aumento no volume de dados
25. E quão grande?
Tipo de Instância
Dados do Twitter
(apenas a busca)
Dados do Common-crawl
(apenas a busca)
search.m1.small
6.7 GB, 4.7 milhões de
documentos
4 GB, 625 mil
documentos
search.m1.large
26.8 GB, 18.8 milhões
de documentos
16 GB, 2.5 milhões de
documentos
search.m2.xlarge
53.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
30. Processo de carga de dados
aws 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
32. Escalando a partir de consultas
search
request
volume and
complexity
SEARCH INSTANCE
Index Partition 1
Replica 1
SEARCH INSTANCE
Index Partition 2
Replica 1
SEARCH INSTANCE
Index Partition n
Replica 1
SEARCH INSTANCE
Index Partition 1
Replica 2
SEARCH INSTANCE
Index Partition 2
Replica 2
SEARCH INSTANCE
Index Partition n
Replica 2
SEARCH INSTANCE
Index Partition 1
Replica n
SEARCH INSTANCE
Index Partition 2
Replica n
SEARCH INSTANCE
Index Partition n
Replica n
33. Escalando a partir de consultas
Tipo de Instância Threads JMeter
Throughput
do Twitter
Throughput
da Common Crawl
search.m1.small 20
2 hosts
10 threads
25.1 qps
397 ms
48.3 qps
206 ms
search.m1.large 20
4 hosts
20 threads
108.5 qps
183 ms
291.5 qps
68 ms
search.m2.xlarge 20
8 hosts
40 threads
419.6 qps
94 ms
665.9 qps
59 ms
search.m2.2xlarge 20
16 hosts
80 threads
566.4 qps
140 ms
985.3 qps
80 ms
41. Filtro versus Consulta
• Filtros não contribuem
para o ranqueamento
• Filtros podem ser
mais rápidos
• Filtros suportam
linguagem estruturada
de consulta Times include HTTP transport
0
50
100
150
200
250
q= fq= fq= (10 Queries)
TotalQueryLatency,Milliseconds
Query Condi on
p50
Average
p90
43. 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 @thejoelstein
Unless it's #SFGiants...
• Apropos of nothing:
#SFGiants are in the Big
Show again...
56. Melhores Práticas
• Escolha a abordagem de domínio único quando
o número de vizinhos for grande
• Escolha a abordagem de múltiplos domínios
quando existe grande variação de escala ou
configuração entre os vizinhos
• Escolha uma abordagem híbrida (quando fizer
sentido) para minimizar o custo e maximizar a
performance
58. Monitoramento do Comportamento de
Usuário
Servidores
de Aplicação
Amazon
Redshift
Informaçòes de Sessão
Consultas/Resultados
Cliques
Compras
Amazon
CooudSearch
Amazon
EMR
Banco da
Aplicação
Processamento
59. O Que é Possível Fazer com Comportamento
de Usuário?
• Boosting de documentos
• Enriquecimento de documentos
• Criação de sinônimos
• Etc…
60.
61. • 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 Maiores
Empresas do Brasil*
“Queremos focar
nas
funcionalidades
desejadas pelos
clientes”
David Lojudice, CTO do
Scup
Fonte: Revista Exame
62. • “Near real-time search”: busca
em documentos recém-
indexados
• Mínimo esforço do time de
DevOps.
• Volume crescente de buscas
• Volume crescente de indexação
O Desafio
63. • 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
64. • 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
65. • “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
66. • 300 milhões de documentos
• 400 mil queries / dia
• 300 mil indexações / dia
• 17 instâncias search.m2.2xlarge
CloudSearch no Scup
67. • 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, diferentes
idiomas, etc.
Resumo