Treinamento Elasticsearch - Parte 1

  • View
    173

  • Download
    13

Embed Size (px)

Text of Treinamento Elasticsearch - Parte 1

Introduo ao ElasticsearchLuiz Henrique Zambom Santana24 de Fevereiro de 2015AgendaViso e HistricoConceitosInstalaoSenseDesenvolvimentoBuscasClientesCliente JavaBulkloadMonitoramentoProblemasPluginsArquiteturaConcluses e prximos passosApresentaoConsultor AdHocFreelancerAutor DevMediaDoutorando UFSCVisoflexible and powerful open source, distributed real-time search and analytics engine for the cloudcool. bonsai cool

HistricoPrimeira verso lanada em 2010Pelo Israelense Shay Banon (https://twitter.com/kimchy)Cdigo aberto em:https://github.com/elasticsearch/elasticsearchSuportado pela empresa Elasticsearch, com sede em AmsterdamA Elasticsearch tambm suporta o Kibana e o Logstash

Conceitos bsicosUm mecanismo de busca textualNo um banco de dados tradicional, pois:No usa SQLNo suporta transaesNo possui mecanismos de autenticao... baseado no Apache Lucene, um framework Java que facilita busca em textosConceitos bsicosAlguns dos conceitos do ES so derivados do Lucenendice (como um banco de dados)Documento, um texto formatado em JSONCampoMapeamentoConceitos bsicos comparao com BDRLuceneBanco de dados relacional (BDR)ndice (Index)EsquemaTypeTabelaDocumento (JSON)LinhaCampo (Field)ColunaMapeamento (Mapping)Estrutura da tabelaQuery DSLSQLInstalaoA instalao do ES bastante simples:Baixar o zip do site:http://www.elasticsearch.org/overview/elkdownloads/Deszipar e executar:bin/elasticsearchComo servio no Linux:apt-get install elasticsearchyum install elasticsearchPara verificar se est executando:sudo /etc/init.d/elasticsearch startcurl http://127.0.0.1:9200sudo /etc/init.d/elasticsearch stop

Instalao/etc/elasticsearch/bin: contm os scripts binrios para iniciar e parar cada n, usando o comando /bin/elasticsearch start;/etc/elasticsearch/conf: contm arquivos de configurao, como o elasticsearch.yml e o logging.yml;/etc/default/elasticseach: que contm as variveis 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 subdiretrioComandos bsicosO que podemos fazer com o ES?Criar ndiceCriar mapeamentoInserir documentoRecuperar documentoAlterar documentoExcluir documentoVamos usar o Sensetimo plugin para testar comandos:

Criar um ndiceForma mais simples:PUT /goodnamePodemos tambm adicionar configuraes na criao desse ndice:PUT / goodname/{"number_of_shards": 5, "number_of_replicas": 1, "analysis": { "analyzer": {"sinonimo": {"tokenizer": "whitespace","filter": ["lowercase", "filtro_sinonimo"] },...Criar mapeamentoExemplo de criao de ndice e de mapeamento:

POST /goodname/processo/_mapping{ "processo": { ...(mostrar arquivo)}}

Indexar documentosPOST /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$ 79827,50"}

Processo de buscaLista invertida

Processo de buscaAnalisadores

BuscasTipos mais simplesMatchMulti matchPrefixPhraseTermBoolDismax

Buscas Match AllPOST /goodname/processo/_search{ "query": { "match_all": {} }}

Buscas MatchPOST /goodname/processo/_search{ "query": { "match": { "descricao": "carro" } }}Buscas - Multi matchPOST /goodname/processo/_search{ "query": { "multi_match": { "query": "carro", "fields": [ "descricao", "palavrachave" ] } }}Buscas - PrefixPOST /goodname/processo/_search{ "query": {"prefix" : { "relator" : "ANTONIO" } }}Buscas - PhrasePOST /goodname/processo/_search{ "query": { "match_phrase": { "title": "REPRESENTACAO" } }}Buscas - TermPOST /goodname/processo/_search{ "query": {"term" : { "numero" : "100587/2003" } }}

Buscas - BoolPOST /goodname/processo/_search{ "query": { "bool": { "must": [ {} ], "should": [ {} ], "must_not": [ {} ] } }}Buscas Dismax (mudana na forma de calcular o score)POST /goodname/processo/_search{ "query": { "dis_max": { "tie_breaker": 0.7, "boost": 1.2, "queries": [ { "term": { "status": "fechado" } }, { "term": { "status": "cancelado" } } ] } }}BuscasResultado{ "took": 2, "timed_out": false, "_shards": { "total": 5, "successful": 5, "failed": 0 }, "hits": {

Arquitetura

ClientesJava, Javascript, PHP, Python...Em Java

org.elasticsearch

elasticsearch

1.3.2

ClientesO cliente Java permite, por exemplo:Realizar buscasCriar ndiceCriar mapeamentosVerificar estado dos nsRealizar atividades de manuteno

Criar um clienteDefinirNome do clusterEndereos de redeIMPORTANTE:Todos ns do cluster devem ser adicionados ao cliente, isto garante:Round-RobinO cliente ir procurar os ns disponveis

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).setSource(builder).execute().actionGet();}

BuscasTipos de buscaItem cobertoEndereoAuto completeGeogrficoImportante:Tambm utiliza o XContentBuilderRetorno em hitsOrdenado por score

BulkloadControlar o tamanho do bulkLista de falhasPossvel enviar indexao, alterao ou excluso em uma mesma chamada PluginsSite pluginsHEADhttp://localhost:9200/_plugin/head/plugin -install mobz/elasticsearch-headBigDeskhttp://localhost:9200/_plugin/bigdesk/plugin -install lukas-vlcek/bigdeskInquisitorhttps://github.com/polyfractal/elasticsearch-inquisitorplugin -install polyfractal/elasticsearch-inquisitorplugin --url file:///c:/tmp/elasticsearch-inquisitor-master.zip --install inquisitorSynonymsNa inicializao 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 EShttps://github.com/elasticsearch/curatorInstalao:Instalar pip, gerenciador de pacotes do python, se a mquina tem Python 2.7.9ou mais novo, o pip j est instalador#yum -y install python-pipExecutarpip install elasticsearch-curatorConfigurar o comando de excluso abaixo para ser executado diariamentecurator delete --older-than 7 --prefix .marvel-

Instalaocluster.name: agoodnamenode.name: "anothergoodname"discovery.zen.ping.multicast.enabled: falsediscovery.zen.ping.unicast.hosts: ["10.0.0.201", "10.0.0.202", "10.0.0.203"]bootstrap.mlockall: truescript.disable_dynamic: falseExemplo de Arquitetura BulkloadBatch/ SchedulerES1. Extrao de arquivos2. Executa comando3. ChamadasbulkExemplo de Arquitetura com Java e BDNavegadorNavegadorNavegadorJavaES1. HTTP2. HTTP3. Broadcast para o cluster:Repassa a consulta para todos os nsRecebe resultados e ordena de acordo com scoreRetorna para o cliente4. IDs5. Consulta por IDs6. Retornavalorescompletos7. HTTPConsideraes sobre arquiteturaNmero de threads# n: 3x4 (processadores): 12# cluster: 12x4: 48For count/search operations. Defaults to fixed with a size of 3x # of available processors, queue_size of 1000.Thread poolhttp://10.2.0.242:9200/_cat/thread_poolhttp://www.elasticsearch.org/guide/en/elasticsearch/reference/current/cat-thread-pool.htmlPara recuperar as configuraeshttp://10.2.0.242:9200/_cluster/settingsModificar apenas o tamanho da filaPUT _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, cluster.routing.allocation.balance.threshold:0.2 }}

Consideraes sobre arquiteturaBalanceamento de shards:Com os valores padro o cluster pode entrar em um estado no qual alguns ns possuem mais shards primrios que outros, como ilustrado pelo HEAD. Nesse caso, os ns 1 e 4 vo receber muito menos chamados que os ns 2 e 3, pois no possuem ns primrios. Para alterar isso, devemos modificar os padres de alocao 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, cluster.routing.allocation.balance.threshold:0.2 }}

Consideraes sobre arquiteturaGargalos possveis:Aumentar paralelismo e concorrncia:Nmero de shardsNmero de rplicasAumentar o intervalo de refreshCriar ndices diriosWarmersRouting ou ndice por clienteSlowlogCurator e Marvel

Consideraes sobre arquiteturaIndex aliasManualmentePUT /nome_index_v1/_alias/nome_index/Javaclient.admin().indices().prepareAliases().addAlias("nome_index_v1", "nome_index").execute().get();

ConclusesRpida evoluoSetembro/2014: 1.3.1Janeiro/2015: 1.4.2Instalar Inquisitor e BigDesk em produoAnalisar desempenho de forma contnuaFerramentas como o MarvelOutras ferramentas interess