Introdução ao Elasticsearch
Luiz Henrique Zambom Santana
24 de Fevereiro de 2015
Agenda
•Visão e Histórico
•Conceitos
•Instalação
•Sense
•Desenvolvimento
•Buscas
•Clientes
•Cliente Java
•Bulkload
•Monitoramento
•Problemas
•Plugins
•Arquitetura
Apresentação
•Consultor AdHoc
•Freelancer
•Autor DevMedia
•Doutorando UFSC
Visão
•“flexible and powerful open source,
distributed real-time search and
analytics engine for the cloudcool. bonsai
cool”
Histórico
•Primeira versão lançada em 2010
•Pelo Israelense Shay Banon (https://twitter.com/kimchy)
•Código aberto em:
•https://github.com/elasticsearch/elasticsearch
•Suportado pela empresa Elasticsearch, com sede em Amsterdam
•A Elasticsearch também suporta o Kibana e o Logstash
Conceitos básicos
•Um mecanismo de busca textual
•Não é um banco de dados tradicional, pois:
•Não usa SQL
•Não suporta transações
•Não possui mecanismos de autenticação
•...
•É baseado no Apache Lucene, um framework Java que facilita busca
em textos
Conceitos básicos
•Alguns dos conceitos do ES são derivados do Lucene
•Índice (como um banco de dados)
•Documento, um texto formatado em JSON
•Campo
•Mapeamento
Conceitos básicos – comparação com BDR
Lucene Banco de dados relacional (BDR)
Índice (Index) Esquema
Type Tabela
Documento (JSON) Linha
Campo (Field) Coluna
Mapeamento (Mapping) Estrutura da tabela
Query DSL SQL
Instalação
•A instalação do ES é bastante simples:
•Baixar o zip do site:
•http://www.elasticsearch.org/overview/elkdownloads/
•Deszipar e executar:
•bin/elasticsearch
•Como serviço no Linux:
•apt-get –install elasticsearch
•yum install elasticsearch
•Para verificar se está executando:
•sudo /etc/init.d/elasticsearch start
•curl http://127.0.0.1:9200
•sudo /etc/init.d/elasticsearch stop
Instalação
•/etc/elasticsearch/bin: contém os scripts binários para iniciar e parar
cada nó, usando o comando /bin/elasticsearch start;
•/etc/elasticsearch/conf: contém arquivos de configuração, como o
elasticsearch.yml e o logging.yml;
•/etc/default/elasticseach: que contém as variáveis de ambiente como
tamanho de heap, e quantidade de descritores de arquivos;
•/var/lib/elasticsearch/data: onde se localiza os arquivos de dados
para cada índice, shard alocado para cada nó;
•/var/log/elasticsearch: onde fica os arquivos de log, incluindo o log de
uso e o slowlog;
•/usr/share/elasticsearch/plugins: onde localiza-se os arquivos de
plug-n, sendo que cada plug-in fica contido em um subdiretório
Comandos básicos
•O que podemos fazer com o ES?
•Criar índice
•Criar mapeamento
•Inserir documento
•Recuperar documento
•Alterar documento
•Excluir documento
Vamos usar o Sense
•Ótimo plugin para testar comandos:
Criar um índice
•Forma mais simples:
•PUT /goodname
•Podemos também adicionar configurações na criação desse índice:
PUT / goodname/{
"number_of_shards": 5,
"number_of_replicas": 1,
"analysis": {
"analyzer": {
"sinonimo": {
"tokenizer": "whitespace",
"filter": [ "lowercase", "filtro_sinonimo"]
},
...
Criar mapeamento
•Exemplo de criação de índice e de mapeamento:
POST /goodname/processo/_mapping
{
"processo": {
...(mostrar arquivo)
}
}
Indexar documentos
POST /goodname/processo/1
{
“numero" : “49484/2010",
“interessado" : “CAMARA MUNICIPAL DE NOVA OLIMPIA",
“descricao" : “REPRESENTACAO REF IRREGULARIDADES DA ATUAL
GESTAO, NO QUE SE REFERE AO USO INDEVIDO DE CARRO PARA ATENDER
INTERESSES PESSOAIS/MULTAS DE TRANSITO RECOLHIDAS COM RECURSOS
PUBLICOS, ETC"
}
POST /goodname/processo/2
{
“numero" : “154440/2002",
“relator" : “ANTONIO JOAQUIM",
“descricao" : “CONTRATO Nº 023/C/2002, A PRESTACAO DE
SERVICOS DE MAO DE OBRA NOS CARROS OFICIAIS DA SEDUC NO VALOR DE R$
Processo de busca
•Lista invertida
Processo de busca
•Analisadores
Buscas
•Tipos mais simples
•Match
•Multi match
•Prefix
•Phrase
•Term
•Bool
•Dismax
Buscas – Match All
POST /goodname/processo/_search
{
"query": {
"match_all": {}
}
}
Buscas – Match
POST /goodname/processo/_search
{
"query": {
"match": {
"descricao": "carro"
}
}
}
Buscas - Multi match
POST /goodname/processo/_search
{
"query": {
"multi_match": {
"query": "carro",
"fields": [
"descricao",
"palavrachave"
]
}
}
Buscas - Prefix
POST /goodname/processo/_search
{
"query": {
"prefix" : { "relator" : "ANTONIO" }
}
}
Buscas - Phrase
POST /goodname/processo/_search
{
"query": {
"match_phrase": {
"title": "REPRESENTACAO"
}
}
}
Buscas - Term
POST /goodname/processo/_search
{
"query": {
"term" : { "numero" : "100587/2003" }
}
}
Buscas - Bool
POST /goodname/processo/_search
{
"query": {
"bool": {
"must": [
{}
],
"should": [
{}
],
"must_not": [
Buscas – Dismax (mudança na forma de
calcular o score)
POST /goodname/processo/_search
{
"query": {
"dis_max": {
"tie_breaker": 0.7,
"boost": 1.2,
"queries": [
{
"term": {
"status": "fechado"
Buscas
•Resultado
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
…
Arquitetura
Clientes
•Java, Javascript, PHP, Python...
•Em Java
<dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>1.3.2</version></dependency>
Clientes
•O cliente Java permite, por exemplo:
•Realizar buscas
•Criar índice
•Criar mapeamentos
•Verificar estado dos nós
•Realizar atividades de manutenção
Criar um cliente
•Definir
•Nome do cluster
•Endereços de rede
•IMPORTANTE:
•Todos nós do cluster devem ser adicionados ao cliente, isto garante:
•Round-Robin
•O cliente irá procurar os nós disponíveis
Adicionar um documento
public void create(String id, String produto,
String descricao, double preco) throws IOException {
XContentBuilder builder = jsonBuilder()
.startObject()
.field(" produto ", produto)
.field(" descricao ", descricao)
.field(" preco ", preco)
.endObject();
client.prepareIndex(index, type, id)
Buscas
•Tipos de busca
•Item coberto
•Endereço
•Auto complete
•Geográfico
•Importante:
•Também utiliza o XContentBuilder
•Retorno em hits
•Ordenado por score
Bulkload
•Controlar o tamanho do bulk
•Lista de falhas
•Possível enviar indexação, alteração ou exclusão em uma mesma
chamada
Plugins
•Site plugins
•HEAD
•http://localhost:9200/_plugin/head/
•plugin -install mobz/elasticsearch-head
•BigDesk
•http://localhost:9200/_plugin/bigdesk/
•plugin -install lukas-vlcek/bigdesk
•Inquisitor
•https://github.com/polyfractal/elasticsearch-inquisitor
•plugin -install polyfractal/elasticsearch-inquisitor
•plugin --url file:///c:/tmp/elasticsearch-inquisitor-master.zip --install inquisitor
•Synonyms
•Na inicialização de cada nó:
•[2015-01-14 08:54:33,515][INFO ][plugins ] [Seth] loaded [analysis-
phonetic], sites [bigdesk, head, inquisitor]
Curator
•É um script escrito em python, que permite gerenciar os índices do ES
•https://github.com/elasticsearch/curator
•Instalação:
•Instalar pip, gerenciador de pacotes do python, se a máquina tem Python
2.7.9 ou mais novo, o pip já está instalador
•# yum -y install python-pip
•Executar
•pip install elasticsearch-curator
•Configurar o comando de exclusão abaixo para ser executado diariamente
•curator delete --older-than 7 --prefix .marvel-
•
Instalação
•cluster.name: agoodname
•node.name: "anothergoodname"
•discovery.zen.ping.multicast.enabled: false
•discovery.zen.ping.unicast.hosts: ["10.0.0.201", "10.0.0.202",
"10.0.0.203"]
•bootstrap.mlockall: true
•script.disable_dynamic: false
Exemplo de Arquitetura Bulkload
Batch/
Scheduler
ES
1. Extração de arquivos
2. Executa
comando
3. Chamadas
bulk
Exemplo de Arquitetura com Java e BD
Navegador
Navegador
Navegador
Java
ES
1. HTTP
2. HTTP
3. Broadcast para o cluster:
A.Repassa a consulta para
todos os nós
B.Recebe resultados e
ordena de acordo com
score
C.Retorna para o cliente
4. IDs
5. Consulta
por IDs
6. Retorna
valores
completos
7. HTTP
Considerações sobre arquitetura
•Número de threads
•# nó: 3x4 (processadores): 12
•# cluster: 12x4: 48
•For count/search operations. Defaults to fixed with a size of 3x # of available processors,
queue_size of 1000.
•Thread pool
•http://10.2.0.242:9200/_cat/thread_pool
•http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/cat-thread-
pool.html
•Para recuperar as configurações
•http://10.2.0.242:9200/_cluster/settings
•Modificar apenas o tamanho da fila
PUT _cluster/settings
{
"persistent": {},
Considerações sobre arquitetura
•Balanceamento de shards:
•Com os valores padrão o cluster pode entrar em um estado no qual alguns
nós possuem mais shards primários que outros, como ilustrado pelo HEAD.
Nesse caso, os nós 1 e 4 vão receber muito menos chamados que os nós 2 e
3, pois não possuem nós primários.
•Para alterar isso, devemos modificar os padrões de alocação da
seguinte forma:
PUT _cluster/settings
{
"persistent": {},
"transient": {
"threadpool.search.queue_size":2000,
“cluster.routing.allocation.balance.shard”:0.8,
“cluster.routing.allocation.balance.index”:0.2
“cluster.routing.allocation.balance.primary”:0.8,
Considerações sobre arquitetura
•Gargalos possíveis:
•Aumentar paralelismo e concorrência:
•Número de shards
•Número de réplicas
•Aumentar o intervalo de refresh
•Criar índices diários
•Warmers
•Routing ou índice por cliente
•Slowlog
•Curator e Marvel
Considerações sobre arquitetura
•Index alias
•Manualmente
•PUT /nome_index_v1/_alias/nome_index/
•Java
•client.admin().indices().prepareAliases().addAlias("nome_index_v1",
"nome_index").execute().get();
Conclusões
•Rápida evolução
•Setembro/2014: 1.3.1
•Janeiro/2015: 1.4.2
•Instalar Inquisitor e BigDesk em produção
•Analisar desempenho de forma contínua
•Ferramentas como o Marvel
•Outras ferramentas interessantes do Elasticsearch
•Agregação
•Percolation
•Gargalo:
•Bulkload
•Uso do banco de dados
•Uso de Redis
Referências
•https://gist.github.com/reyjrar/4364063
•http://blog.trifork.com/2013/10/24/how-to-avoid-the-split-brain-
problem-in-elasticsearch/
•http://www.elasticsearch.org/blog/performance-considerations-
elasticsearch-indexing/
•https://www.found.no/foundation/optimizing-elasticsearch-searches/
•https://blog.codecentric.de/en/2014/05/elasticsearch-indexing-
performance-cheatsheet/
•https://www.youtube.com/watch?v=LDyxijDEqj4

Treinamento Elasticsearch - Parte 1

  • 1.
    Introdução ao Elasticsearch LuizHenrique Zambom Santana 24 de Fevereiro de 2015
  • 2.
  • 3.
  • 4.
    Visão •“flexible and powerfulopen source, distributed real-time search and analytics engine for the cloudcool. bonsai cool”
  • 5.
    Histórico •Primeira versão lançadaem 2010 •Pelo Israelense Shay Banon (https://twitter.com/kimchy) •Código aberto em: •https://github.com/elasticsearch/elasticsearch •Suportado pela empresa Elasticsearch, com sede em Amsterdam •A Elasticsearch também suporta o Kibana e o Logstash
  • 6.
    Conceitos básicos •Um mecanismode busca textual •Não é um banco de dados tradicional, pois: •Não usa SQL •Não suporta transações •Não possui mecanismos de autenticação •... •É baseado no Apache Lucene, um framework Java que facilita busca em textos
  • 7.
    Conceitos básicos •Alguns dosconceitos do ES são derivados do Lucene •Índice (como um banco de dados) •Documento, um texto formatado em JSON •Campo •Mapeamento
  • 8.
    Conceitos básicos –comparação com BDR Lucene Banco de dados relacional (BDR) Índice (Index) Esquema Type Tabela Documento (JSON) Linha Campo (Field) Coluna Mapeamento (Mapping) Estrutura da tabela Query DSL SQL
  • 9.
    Instalação •A instalação doES é bastante simples: •Baixar o zip do site: •http://www.elasticsearch.org/overview/elkdownloads/ •Deszipar e executar: •bin/elasticsearch •Como serviço no Linux: •apt-get –install elasticsearch •yum install elasticsearch •Para verificar se está executando: •sudo /etc/init.d/elasticsearch start •curl http://127.0.0.1:9200 •sudo /etc/init.d/elasticsearch stop
  • 10.
    Instalação •/etc/elasticsearch/bin: contém osscripts binários para iniciar e parar cada nó, usando o comando /bin/elasticsearch start; •/etc/elasticsearch/conf: contém arquivos de configuração, como o elasticsearch.yml e o logging.yml; •/etc/default/elasticseach: que contém as variáveis de ambiente como tamanho de heap, e quantidade de descritores de arquivos; •/var/lib/elasticsearch/data: onde se localiza os arquivos de dados para cada índice, shard alocado para cada nó; •/var/log/elasticsearch: onde fica os arquivos de log, incluindo o log de uso e o slowlog; •/usr/share/elasticsearch/plugins: onde localiza-se os arquivos de plug-n, sendo que cada plug-in fica contido em um subdiretório
  • 11.
    Comandos básicos •O quepodemos fazer com o ES? •Criar índice •Criar mapeamento •Inserir documento •Recuperar documento •Alterar documento •Excluir documento
  • 12.
    Vamos usar oSense •Ótimo plugin para testar comandos:
  • 13.
    Criar um índice •Formamais simples: •PUT /goodname •Podemos também adicionar configurações na criação desse índice: PUT / goodname/{ "number_of_shards": 5, "number_of_replicas": 1, "analysis": { "analyzer": { "sinonimo": { "tokenizer": "whitespace", "filter": [ "lowercase", "filtro_sinonimo"] }, ...
  • 14.
    Criar mapeamento •Exemplo decriação de índice e de mapeamento: POST /goodname/processo/_mapping { "processo": { ...(mostrar arquivo) } }
  • 15.
    Indexar documentos POST /goodname/processo/1 { “numero": “49484/2010", “interessado" : “CAMARA MUNICIPAL DE NOVA OLIMPIA", “descricao" : “REPRESENTACAO REF IRREGULARIDADES DA ATUAL GESTAO, NO QUE SE REFERE AO USO INDEVIDO DE CARRO PARA ATENDER INTERESSES PESSOAIS/MULTAS DE TRANSITO RECOLHIDAS COM RECURSOS PUBLICOS, ETC" } POST /goodname/processo/2 { “numero" : “154440/2002", “relator" : “ANTONIO JOAQUIM", “descricao" : “CONTRATO Nº 023/C/2002, A PRESTACAO DE SERVICOS DE MAO DE OBRA NOS CARROS OFICIAIS DA SEDUC NO VALOR DE R$
  • 16.
  • 17.
  • 18.
    Buscas •Tipos mais simples •Match •Multimatch •Prefix •Phrase •Term •Bool •Dismax
  • 19.
    Buscas – MatchAll POST /goodname/processo/_search { "query": { "match_all": {} } }
  • 20.
    Buscas – Match POST/goodname/processo/_search { "query": { "match": { "descricao": "carro" } } }
  • 21.
    Buscas - Multimatch POST /goodname/processo/_search { "query": { "multi_match": { "query": "carro", "fields": [ "descricao", "palavrachave" ] } }
  • 22.
    Buscas - Prefix POST/goodname/processo/_search { "query": { "prefix" : { "relator" : "ANTONIO" } } }
  • 23.
    Buscas - Phrase POST/goodname/processo/_search { "query": { "match_phrase": { "title": "REPRESENTACAO" } } }
  • 24.
    Buscas - Term POST/goodname/processo/_search { "query": { "term" : { "numero" : "100587/2003" } } }
  • 25.
    Buscas - Bool POST/goodname/processo/_search { "query": { "bool": { "must": [ {} ], "should": [ {} ], "must_not": [
  • 26.
    Buscas – Dismax(mudança na forma de calcular o score) POST /goodname/processo/_search { "query": { "dis_max": { "tie_breaker": 0.7, "boost": 1.2, "queries": [ { "term": { "status": "fechado"
  • 27.
    Buscas •Resultado { "took": 2, "timed_out": false, "_shards":{ "total": 5, "successful": 5, "failed": 0 }, "hits": { …
  • 28.
  • 29.
    Clientes •Java, Javascript, PHP,Python... •Em Java <dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>1.3.2</version></dependency>
  • 30.
    Clientes •O cliente Javapermite, por exemplo: •Realizar buscas •Criar índice •Criar mapeamentos •Verificar estado dos nós •Realizar atividades de manutenção
  • 31.
    Criar um cliente •Definir •Nomedo cluster •Endereços de rede •IMPORTANTE: •Todos nós do cluster devem ser adicionados ao cliente, isto garante: •Round-Robin •O cliente irá procurar os nós disponíveis
  • 32.
    Adicionar um documento publicvoid create(String id, String produto, String descricao, double preco) throws IOException { XContentBuilder builder = jsonBuilder() .startObject() .field(" produto ", produto) .field(" descricao ", descricao) .field(" preco ", preco) .endObject(); client.prepareIndex(index, type, id)
  • 33.
    Buscas •Tipos de busca •Itemcoberto •Endereço •Auto complete •Geográfico •Importante: •Também utiliza o XContentBuilder •Retorno em hits •Ordenado por score
  • 34.
    Bulkload •Controlar o tamanhodo bulk •Lista de falhas •Possível enviar indexação, alteração ou exclusão em uma mesma chamada
  • 35.
    Plugins •Site plugins •HEAD •http://localhost:9200/_plugin/head/ •plugin -installmobz/elasticsearch-head •BigDesk •http://localhost:9200/_plugin/bigdesk/ •plugin -install lukas-vlcek/bigdesk •Inquisitor •https://github.com/polyfractal/elasticsearch-inquisitor •plugin -install polyfractal/elasticsearch-inquisitor •plugin --url file:///c:/tmp/elasticsearch-inquisitor-master.zip --install inquisitor •Synonyms •Na inicialização de cada nó: •[2015-01-14 08:54:33,515][INFO ][plugins ] [Seth] loaded [analysis- phonetic], sites [bigdesk, head, inquisitor]
  • 36.
    Curator •É um scriptescrito em python, que permite gerenciar os índices do ES •https://github.com/elasticsearch/curator •Instalação: •Instalar pip, gerenciador de pacotes do python, se a máquina tem Python 2.7.9 ou mais novo, o pip já está instalador •# yum -y install python-pip •Executar •pip install elasticsearch-curator •Configurar o comando de exclusão abaixo para ser executado diariamente •curator delete --older-than 7 --prefix .marvel- •
  • 37.
    Instalação •cluster.name: agoodname •node.name: "anothergoodname" •discovery.zen.ping.multicast.enabled:false •discovery.zen.ping.unicast.hosts: ["10.0.0.201", "10.0.0.202", "10.0.0.203"] •bootstrap.mlockall: true •script.disable_dynamic: false
  • 38.
    Exemplo de ArquiteturaBulkload Batch/ Scheduler ES 1. Extração de arquivos 2. Executa comando 3. Chamadas bulk
  • 39.
    Exemplo de Arquiteturacom Java e BD Navegador Navegador Navegador Java ES 1. HTTP 2. HTTP 3. Broadcast para o cluster: A.Repassa a consulta para todos os nós B.Recebe resultados e ordena de acordo com score C.Retorna para o cliente 4. IDs 5. Consulta por IDs 6. Retorna valores completos 7. HTTP
  • 40.
    Considerações sobre arquitetura •Númerode threads •# nó: 3x4 (processadores): 12 •# cluster: 12x4: 48 •For count/search operations. Defaults to fixed with a size of 3x # of available processors, queue_size of 1000. •Thread pool •http://10.2.0.242:9200/_cat/thread_pool •http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/cat-thread- pool.html •Para recuperar as configurações •http://10.2.0.242:9200/_cluster/settings •Modificar apenas o tamanho da fila PUT _cluster/settings { "persistent": {},
  • 41.
    Considerações sobre arquitetura •Balanceamentode shards: •Com os valores padrão o cluster pode entrar em um estado no qual alguns nós possuem mais shards primários que outros, como ilustrado pelo HEAD. Nesse caso, os nós 1 e 4 vão receber muito menos chamados que os nós 2 e 3, pois não possuem nós primários. •Para alterar isso, devemos modificar os padrões de alocação da seguinte forma: PUT _cluster/settings { "persistent": {}, "transient": { "threadpool.search.queue_size":2000, “cluster.routing.allocation.balance.shard”:0.8, “cluster.routing.allocation.balance.index”:0.2 “cluster.routing.allocation.balance.primary”:0.8,
  • 42.
    Considerações sobre arquitetura •Gargalospossíveis: •Aumentar paralelismo e concorrência: •Número de shards •Número de réplicas •Aumentar o intervalo de refresh •Criar índices diários •Warmers •Routing ou índice por cliente •Slowlog •Curator e Marvel
  • 43.
    Considerações sobre arquitetura •Indexalias •Manualmente •PUT /nome_index_v1/_alias/nome_index/ •Java •client.admin().indices().prepareAliases().addAlias("nome_index_v1", "nome_index").execute().get();
  • 44.
    Conclusões •Rápida evolução •Setembro/2014: 1.3.1 •Janeiro/2015:1.4.2 •Instalar Inquisitor e BigDesk em produção •Analisar desempenho de forma contínua •Ferramentas como o Marvel •Outras ferramentas interessantes do Elasticsearch •Agregação •Percolation •Gargalo: •Bulkload •Uso do banco de dados •Uso de Redis
  • 45.