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::
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.:
- Login to your Twitter account
- Go to https://dev.twitter.com/apps/
- Create a new Twitter application (here I give Twitter-Qbox-Stream as the name of the app).
Depois que você criar com êxito um aplicativo do Twitter, você obtém os seguintes parâmetros no “Chaves e Tokens de Acesso”:
- Chave do Consumidor (API Key)
- Segredo do Consumidor (API Segredo)
- Token de Acesso
- Token de Acesso Segredo
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.