pesquisar e obter grandes conjuntos de dados na pesquisa elastica de forma eficiente

para este post, iremos usar a pesquisa elastica hospedada em Qbox.io. você pode se inscrever ou lançar o seu conjunto aqui, ou clique em “Começar” na navegação de cabeçalho. Se você precisar de Ajuda para configurar, consulte o ” Provisioning a Qbox Elasticsearch Cluster.”

Our Goal

Qbox provides a turnkey solution for Elasticsearch, Kibana and many of Elasticsearch analysis and monitoring plugins. O objetivo do tutorial é usar o Qbox para demonstrar a obtenção de grandes blocos de dados usando uma varredura e pedidos de posicionamento. Nós configuramos Logstash em um nó/máquina separado para reunir o fluxo do Twitter e usar o Qbox provisioned Elasticsearch para reproduzir em torno do Scan poderoso e Scroll API.

a nossa configuração da pilha de alces tem três componentes principais:

  • Elasticsearch: é usado para armazenar todos os logs de aplicação e monitoramento(provisionados pelo Qbox).
  • Logstash: o componente do servidor que processa os registos de entrada e alimenta o ES.
  • Kibana(facultativo): Uma interface web para pesquisar e visualizar logs (provisionada pelo Qbox).

pré-requisitos

a quantidade de CPU, RAM e armazenamento que o seu servidor Elasticsearch irá necessitar depende do volume de logs que pretende reunir. Para este tutorial, vamos usar um Qbox provisionado Elasticsearch com a seguinte especificação mínima:

  • Fornecedor: AWS
  • Versão: 5.1.1
  • RAM: 1GB
  • CPU: vCPU1
  • Réplicas: 0

As especificações acima podem ser alteradas de acordo com os seus requisitos desejados. Selecione os nomes, versões e regiões apropriadas para suas necessidades. Para este exemplo, nós usamos a versão Elasticsearch 5.1.1, a versão mais atual é 5.3. Apoiamos todas as versões da Elasticsearch no Qbox. (Para saber mais sobre as principais diferenças entre 2.X e 5.X, Clique aqui.)

além do nosso servidor Elasticsearch, vamos precisar de um servidor de logstash separado para processar o fluxo de entrada do twitter a partir da API do twitter e enviá-los para a Elasticsearch. Para fins de simplicidade e teste, o servidor logstash também pode atuar como o servidor cliente em si. Os endereços de Endpoint e Transporte para o nosso cluster Elasticsearch provisionado Qbox são os seguintes::

 common_1.png

ponto de Extremidade: API REST

https://ec18487808b6908009d3:[email protected]:32563

Autenticação

  • nome de usuário = ec18487808b6908009d3
  • palavra-Passe = efcec6a1e0

de TRANSPORTE (NATIVO JAVA)

eb843037.qb0x.com:30543

Nota: por Favor, certifique-se de listar o logstash IP do servidor de Qbox Elasticsearch de cluster.

instale Logstash

Descarregue e instale a chave de assinatura pública:

wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

usaremos o Logstash version 2.4.x como compatível com o nosso Elasticsearch version 5.1.x. A matriz elástica de suporte a produtos comunitários pode ser encaminhada a fim de esclarecer qualquer problema de versão.

adicione a definição do repositório ao seu /etc/apt/sources.listar o ficheiro:

echo "deb https://packages.elastic.co/logstash/2.4/debian stable main" | sudo tee -a /etc/apt/sources.list

execute sudo apt-get update e o repositório está pronto para ser usado. Você pode instalá-lo com:

sudo apt-get update && sudo apt-get install logstash

Alternativamente, o alcatrão de logstash também pode ser baixado do site de lançamentos de Produtos elásticos. Então, os passos de configuração e execução de logstash são bastante simples:

  • Download and unzip Logstash
  • Prepare a logstash.conf config file
  • Run bin/logstash -f logstash.conf -t to check config (logstash.conf)
  • Run bin/logstash -f logstash.conf

Configure Logstash (Twitter Stream)

Logstash os arquivos de configuração estão no formato JSON, e residem em /etc/logstash/conf.d. A configuração consiste em três seções: entradas, filtros e Saídas.Precisamos ser autorizados a tirar dados do Twitter através de sua API. Esta parte é fácil.:

  1. Login to your Twitter account
  2. Go to https://dev.twitter.com/apps/
  3. Create a new Twitter application (here I give Twitter-Qbox-Stream as the name of the app).

t1.png

Depois que você criar com êxito um aplicativo do Twitter, você obtém os seguintes parâmetros no “Chaves e Tokens de Acesso”:

  1. Chave do Consumidor (API Key)
  2. Segredo do Consumidor (API Segredo)
  3. Token de Acesso
  4. Token de Acesso Segredo

t2.png

estamos agora prontos para criar o caminho de dados do Twitter (stream) dos servidores do Twitter para a nossa máquina. Usaremos os quatro parâmetros acima (chave do consumidor, segredo do consumidor, token de acesso, token de acesso secreto) para configurar a entrada do twitter para logstash.Vamos criar um ficheiro de configuração chamado 02-twitter-input.conf e configurar a nossa entrada “twitter”:

sudo vi /etc/logstash/conf.d/02-twitter-input.conf

inserir a seguinte configuração de entrada:

input { twitter { consumer_key => "BCgpJwYPDjXXXXXX80JpU0" consumer_secret => "Eufyx0RxslO81jpRuXXXXXXXMlL8ysLpuHQRTb0Fvh2" keywords => oauth_token => "193562229-o0CgXXXXXXXX0e9OQOob3Ubo0lDj2v7g1ZR" oauth_token_secret => "xkb6I4JJmnvaKv4WXXXXXXXXS342TGO6y0bQE7U" }}

gravar e sair do ficheiro 02-twitter-input.conf.

isto especifica uma entrada no twitter que irá filtrar tweets com palavras-chave “mobile”, “java”, “android”, “elasticsearch”, “search” e passá-los para a saída de logstash. Salva e desiste. Por último, vamos criar um ficheiro de configuração chamado 30-elasticsearch-output.conf:

sudo vi /etc/logstash/conf.d/30-elasticsearch-output.conf

inserir a seguinte configuração de saída:

output { elasticsearch { hosts => user => "ec18487808b6908009d3" password => "efcec6a1e0" index => "twitter-%{+YYYY.MM.dd}" document_type => "tweet" } stdout { codec => rubydebug }}

salvar e sair. Esta saída basicamente configura o Logstash para armazenar os dados de logs no twitter na Elasticsearch que está em execução em https://eb843037.qb0x.com:30024/, em um índice com o nome do twitter.

se tiver baixado o tar de logstash ou zip, pode criar um logstash.ficheiro conf com entrada, filtro e saída num só lugar.

sudo vi LOGSTASH_HOME/logstash.conf

inserir a seguinte configuração de entrada e saída na barra de Registo.conf

input { twitter { consumer_key => "BCgpJwYPDjXXXXXX80JpU0" consumer_secret => "Eufyx0RxslO81jpRuXXXXXXXMlL8ysLpuHQRTb0Fvh2" keywords => oauth_token => "193562229-o0CgXXXXXXXX0e9OQOob3Ubo0lDj2v7g1ZR" oauth_token_secret => "xkb6I4JJmnvaKv4WXXXXXXXXS342TGO6y0bQE7U" }}output { elasticsearch { hosts => user => "ec18487808b6908009d3" password => "efcec6a1e0" index => "twitter-%{+YYYY.MM.dd}" document_type => "tweet" } stdout { codec => rubydebug }}

teste a sua configuração de registo com este comando:

sudo service logstash configtest

deve mostrar a configuração OK se não houver erros de sintaxe. Caso contrário, tente ler o resultado do erro para ver o que está errado com sua configuração de Logstash.

reiniciar o Logstash, e permitir-lhe, para colocar as nossas alterações de configuração em efeito:

sudo service logstash restartsudo update-rc.d logstash defaults 96 9

se descarregou tar ou zip de logstash, pode ser executado usando o seguinte comando

bin/logstash -f logstash.conf

são recebidas numerosas respostas. A estrutura do documento é a seguinte::

{ "text": "Learn how to automate anomaly detection on your #Elasticsearch #timeseries data with #MachineLearning:", "created_at": "2017-05-07T07:54:47.000Z", "source": "<a href="%5C">Twitter for iPhone</a>", "truncated": false, "language": "en", "mention": , "retweet_count": 0, "hashtag": , "location": { "lat": 33.686657, "lon": -117.674558 }, "place": { "id": "74a60733a8b5f7f9", "name": "elastic", "type": "city", "full_name": "San Francisco, CA", "street_address": null, "country": "United States", "country_code": "US", "url": "https://api.twitter.com/1.1/geo/id/74a60733a8b5f7f9.json" }, "link": , "user": { "id": 2873953509, "name": "Elastic", "screen_name": "elastic", "location": "SF, CA", "description": "The company behind the Elastic Stack (#elasticsearch, #kibana, Beats, #logstash), X-Pack, and Elastic Cloud" }}

a Elasticsearch permite a paginação adicionando um tamanho e um parâmetro a partir. Por exemplo, se quiser obter resultados em lotes de 5 a partir da 3ª página (por exemplo, mostrar os resultados 11-15), você deve fazer:

curl -XGET 'ES_HOST:ES_PORT/twitter/tweet/_search?size=5&from=10'

no Entanto, torna-se mais caro, como podemos avançar mais e mais na lista de resultados. Cada vez que fazemos uma destas chamadas, Estamos a re-executar a operação de busca, forçando Lucene a sair e marcar todos os resultados, classificá-los e, em seguida, descartar os primeiros 10 (ou 10000 se chegarmos tão longe). A opção mais fácil é o scan e scroll API. A idéia é executar a consulta Real uma vez e, em seguida, elástico cache o resultado em algum lugar e nos dá um “token de Acesso” para voltar e obtê-los. Então chamamos o endpoint da API de pergaminho com dito token para obter a próxima página de resultados.

a fim de usar a rolagem, o pedido de pesquisa inicial deve especificar o parâmetro de rolagem na cadeia de consulta, que diz Elasticsearch por quanto tempo ele deve manter o “contexto de pesquisa” vivo, eg ?scroll=1m.

curl -XPOST 'ES_HOST:ES_PORT/twitter-*/tweet/_search?scroll=1m&pretty' -H 'Content-Type: application/json' -d '{ "size": 100, "query": { "match" : { "text" : "elasticsearch" } }}'

o resultado da solicitação acima inclui um _scroll_id, que deve ser passado para a API de posicionamento, a fim de recuperar o próximo lote de resultados.

curl -XPOST 'ES_HOST:ES_PORT/_search/scroll?pretty' -H 'Content-Type: application/json' -d '{ "scroll" : "1m", "scroll_id" : "DXF1ZXJ5DKJ56hghFHFDJgBAAAAAAAArknJBJsbjYtZndUQlNsdDcwakFSDSSXSQ=="}'

o parâmetro tamanho permite configurar o número máximo de acessos a serem devolvidos com cada lote de resultados. Cada chamada para a API de posicionamento retorna o próximo lote de resultados até que não haja mais resultados para retornar, ou seja, a lista de hits está vazia. Alguns pontos importantes a considerar em relação à API de Scroll e Scan são os seguintes::

  • o pedido inicial de pesquisa e cada pedido subsequente de posicionamento retorna um novo _scroll_id, apenas o _scroll_id mais recente deve ser usado.
  • se o pedido especifica agregações, apenas a resposta de pesquisa inicial conterá os resultados de agregações.
  • os pedidos de pergaminho têm otimizações que os tornam mais rápidos quando a ordem de ordenação é _doc. Se você deseja iterar sobre todos os documentos, independentemente da ordem, esta é a opção mais eficiente do ponto:

curl -XGET 'ES_HOST:ES_PORT/_search?scroll=1m&pretty' -H 'Content-Type: application/json' -d '{ "sort": }'

Contexto de Pesquisa

deslocamento parâmetro informa o Elasticsearch quanto tempo ele deve manter o contexto de pesquisa vivo. Seu valor (por exemplo, 1m) não precisa ser o suficiente para processar todos os dados, apenas precisa ser o suficiente para processar o lote anterior de resultados. Cada pedido de pergaminho define um novo tempo de validade.O contexto de pesquisa é removido automaticamente quando o tempo limite de deslocamento foi excedido. No entanto mantendo rola abrir tem um custo (discutido mais adiante na seção de desempenho) os rolos devem ser explicitamente liberado assim que o deslocamento não está sendo mais usado usando o limpar-deslocamento API:

curl -XDELETE 'ES_HOST:ES_PORT/_search/scroll?pretty' -H 'Content-Type: application/json' -d '{ "scroll_id" : }'

Vários IDs de deslocamento pode ser passado como matriz:

curl -XDELETE 'ES_HOST:ES_PORT/_search/scroll?pretty' -H 'Content-Type: application/json' -d '{ "scroll_id" : }'

Todos os contextos de pesquisa pode ser limpo com o parâmetro _all:

curl -XDELETE 'ES_HOST:ES_PORT/_search/scroll/_all?pretty'

Fatias de Deslocamento

Seleccione consultas que retornam um monte de documentos pode ser dividida em várias fatias, que podem ser consumidos de forma independente:

 curl -XGET 'ES_HOST:ES_PORT/twitter-*/tweet/_search?scroll=1m&pretty' -H 'Content-Type: application/json' -d '{ "slice": { "id": 0, "max": 2 }, "query": { "match" : { "text" : "elasticsearch" } }}'
curl -XGET 'ES_HOST:ES_PORT/twitter-*/tweet/_search?scroll=1m&pretty' -H 'Content-Type: application/json' -d '{ "slice": { "id": 1, "max": 2 }, "query": { "match" : { "text" : "elasticsearch" } }}'

O resultado da primeira solicitação retorna os documentos que pertencem à primeira fatia (id: 0) e o resultado da solicitação de segunda retorna os documentos que pertencem à segunda fatia. Uma vez que o número máximo de fatias é definido para 2, A União dos resultados dos dois pedidos é equivalente aos resultados de uma consulta de pergaminho sem fatiagem.

Por padrão, a separação é feita em cacos primeiro e, em seguida, localmente em cada fragmento usando o _uid campo com a seguinte fórmula:

slice(doc) = floorMod(hashCode(doc._uid), max)

Considerações de Desempenho:

Deslocamento API : O processo de junção de fundo otimiza o índice, unindo segmentos menores para criar novos segmentos maiores, no momento em que os segmentos menores são excluídos. Este processo continua durante a rolagem, mas um contexto de busca aberta impede que os antigos segmentos sejam excluídos enquanto eles ainda estão em uso. É assim que a Elasticsearch é capaz de devolver os resultados da pesquisa inicial, independentemente das alterações subsequentes aos documentos.Manter os segmentos mais antigos vivos significa que são necessários mais cabos de ficheiros. Certifique-se de que os nós foram configurados para ter amplas pegas de arquivos livres e o contexto da API de posicionamento é limpo logo após a obtenção de dados.

podemos verificar quantos contextos de pesquisa estão abertos com a API de estatísticas de nós:

curl -XGET 'ES_HOST:ES_PORT/_nodes/stats/indices/search?pretty'

é, portanto, muito necessário limpar o contexto da API do Scroll como descrito anteriormente na seção da API do Scroll.API em fatias : Se o número de fatias é maior do que o número de fragmentos a fatia de filtro é muito lento na primeira chama, ele tem uma complexidade de O(N) e um custo de memória é igual a ” N ” bits por fatia, onde N é o número total de documentos no shard. Depois de algumas chamadas o filtro deve ser cache e as chamadas subsequentes devem ser mais rápidas, mas você deve limitar o número de consulta fatiada que você executa em paralelo para evitar a explosão de memória.

Nota: O número máximo de fatias permitidas por pergaminho é limitado a 1024 e pode ser atualizado usando a configuração do Índice index.max_slices_per_scroll para contornar este limite.

Para evitar este custo, totalmente, é possível usar o doc_values de outro campo para fazer o corte, mas o usuário deve assegurar-se de que o campo tem as seguintes propriedades:

  • O campo é numérico.
  • doc_values estão activos nesse campo
  • todos os documentos devem conter um único valor. Se um documento tem vários valores para o campo especificado, o primeiro valor é usado.
  • o valor para cada documento deve ser definido uma vez quando o documento é criado e nunca atualizado. Isto garante que cada fatia obtém resultados determinísticos.
  • a cardinalidade do campo deve ser elevada. Isto garante que cada fatia recebe aproximadamente a mesma quantidade de documentos.

O campo “data” é natural que serve propriedades acima e, portanto, pode ser utilizada para fatiar:

curl -XGET 'ES_HOST:ES_PORT/twitter-*/tweet/_search?scroll=1m&pretty' -H 'Content-Type: application/json' -d '{ "slice": { "field": "date", "id": 0, "max": 10 }, "query": { "match" : { "text" : "elasticsearch" } }}'

Tente Qbox Hospedado Elasticsearch

É fácil para girar um padrão hospedado Elasticsearch cluster em qualquer de nossos 47 Rackspace, Softlayer, ou centros de dados da Amazon. E agora você pode fornecer seus próprios créditos AWS na Qbox Private hospedou Elasticsearch.Perguntas? Entrega-nos um bilhete e damos-te uma resposta rápida.

ainda não desfruta dos benefícios de uma pesquisa empresarial hospedada em QBOX? Convidamos você a criar uma conta hoje e descobrir como é fácil gerenciar e escalar seu ambiente Elasticsearch em nosso serviço de hospedagem em nuvem.

Deixe uma resposta

O seu endereço de email não será publicado.