căutarea și preluarea seturilor de date mari în Elasticsearch eficient

pentru acest post, vom folosi Elasticsearch găzduit pe Qbox.io. puteți să vă înscrieți sau să lansați clusterul aici sau să faceți clic pe” Începeți ” în navigarea în antet. Dacă aveți nevoie de ajutor pentru configurare, consultați “provizionarea unui Cluster Qbox Elasticsearch.”

scopul nostru

Qbox oferă o soluție la cheie pentru Elasticsearch, Kibana și multe dintre analiza Elasticsearch și plugin-uri de monitorizare. Scopul tutorialului este de a utiliza Qbox pentru a demonstra preluarea unor bucăți mari de date folosind o cerere de scanare și derulare. Am înființat Logstash într-un nod/mașină separată pentru a aduna Twitter stream și de a folosi Qbox provisioned Elasticsearch pentru a juca în jurul puternic de scanare și Scroll API.

configurarea stivei noastre ELK are trei componente principale:

  • Elasticsearch: acesta este utilizat pentru a stoca toate jurnalele de aplicare și de monitorizare(furnizate de Qbox).
  • Logstash: componenta de server care procesează jurnalele de intrare și feed-uri la ES.
  • Kibana(opțional): O interfață web pentru căutarea și vizualizarea jurnalelor (furnizate de Qbox).

cerințe preliminare

cantitatea de CPU, RAM și stocare pe care serverul Elasticsearch o va solicita depinde de volumul de jurnale pe care intenționați să le colectați. Pentru acest tutorial, vom folosi un Qbox provisioned Elasticsearch cu următoarele specificații minime:

  • furnizor: AWS
  • Versiune: 5.1.1
  • RAM: 1GB
  • CPU: vCPU1
  • replici: 0

specificațiile de mai sus pot fi modificate conform cerințelor dorite. Vă rugăm să selectați numele, versiunile, regiunile potrivite pentru nevoile dvs. Pentru acest exemplu, am folosit Elasticsearch versiunea 5.1.1, cea mai recentă versiune este 5.3. Noi sprijinim toate versiunile de Elasticsearch pe Qbox. (Pentru a afla mai multe despre diferențele majore dintre 2.x și 5.x, click aici.)

în plus față de serverul nostru Elasticsearch, vom avea nevoie de un server logstash separat pentru a procesa fluxul twitter primit de la API-ul twitter și a le expedia către Elasticsearch. Pentru simplitate și testare, serverul logstash poate acționa și ca server client în sine. Punctul final și adresele de Transport pentru QBox provisioned Elasticsearch cluster sunt după cum urmează:

common_1.png

punct final: REST API

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

autentificare

  • Nume utilizator = ec18487808b6908009d3
  • parolă = efcec6a1e0

TRANSPORT (nativ JAVA)

eb843037.qb0x.com:30543

Notă: Asigurați-vă că pentru a lista albă logstash server IP din QBox Elasticsearch cluster.

instalați Logstash

descărcați și instalați cheia de semnare publică:

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

vom folosi Logstash version 2.4.xca compatibil cu Elasticsearch version 5.1.x nostru. Elastic Community Product Support Matrix poate fi menționată pentru a șterge orice probleme de versiune.

adăugați definiția depozitului la /etc/apt/sources.fișier listă:

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

rulați sudo apt-get update și depozitul este gata de utilizare. Îl puteți instala cu:

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

alternativ, logstash tar poate fi descărcat și de pe site-ul Elastic Product Releases. Apoi, pașii de configurare și funcționare logstash sunt destul de simpli:

  • descărcați și dezarhivați Logstash
  • pregătiți un fișier de configurare logstash.conf
  • rulați bin/logstash -f logstash.conf -t pentru a verifica config (logstash.conf)
  • alerga bin/logstash -f logstash.conf

configurați Logstash(Twitter Stream)

fișierele de configurare Logstash sunt în format JSON și se află în /etc/logstash/conf.d. Configurația este formată din trei secțiuni: intrări, filtre și ieșiri.

trebuie să fim autorizați să preluăm date de pe Twitter prin API-ul său. Această parte este ușoară:

  1. Conectați-vă la contul dvs. de Twitter
  2. mergeți la https://dev.twitter.com/apps/
  3. creați o nouă aplicație Twitter (aici dau Twitter-Qbox-Stream ca nume al aplicației).

t1.png

după ce creați cu succes aplicația Twitter, veți obține următorii parametri în “Chei și jetoane de acces”:

  1. cheie de consum (API cheie)
  2. secret de consum (API Secret)
  3. acces Token
  4. acces Token Secret

t2.png

acum suntem gata să creăm calea de date Twitter (stream) de pe serverele Twitter către mașina noastră. Vom folosi cei patru parametri de mai sus (consumer key, consumer secret, access token, access token secret) pentru a configura intrarea twitter pentru logstash.

să creăm un fișier de configurare numit 02-twitter-input.conf și să configurăm intrarea noastră ” twitter:

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

introduceți următoarea configurație de intrare:

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

Salvați și părăsiți fișierul 02-twitter-input.conf.

aceasta specifică o intrare twitter care va filtra tweets cu cuvinte cheie “mobile”, “java”, “android”, “elasticsearch”, “căutare” și să le treacă la ieșire logstash. Salvați și renunțați. În cele din urmă, vom crea un fișier de configurare numit 30-elasticsearch-output.conf:

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

introduceți următoarea configurație de ieșire:

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

Salvați și ieșiți. Această ieșire configurează practic Logstash pentru a stoca datele jurnalelor twitter în Elasticsearch care rulează la https://eb843037.qb0x.com:30024/, într-un index numit după twitter.

dacă ați descărcat logstash tar sau zip, puteți crea un logstash.fișier conf având intrare, filtru și ieșire toate într-un singur loc.

sudo vi LOGSTASH_HOME/logstash.conf

introduceți următoarea configurație de intrare și ieșire în logstash.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 }}

testați configurația Logstash cu această comandă:

sudo service logstash configtest

ar trebui să afișeze configurația OK dacă nu există erori de sintaxă. În caz contrar, încercați să citiți ieșirea de eroare pentru a vedea ce este în neregulă cu configurația Logstash.

Restart Logstash, și activați-l, pentru a pune modificările noastre de configurare în vigoare:

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

dacă ați descărcat logstash tar sau zip, acesta poate fi rulat folosind următoarea comandă

bin/logstash -f logstash.conf

sunt primite numeroase răspunsuri. Structura documentului este după cum urmează:

{ "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" }}

Elasticsearch permite paginare prin adăugarea unei dimensiuni și un parametru de la. De exemplu, dacă doriți să preluați rezultatele în loturi de 5 începând de la pagina A 3-A (adică afișați rezultatele 11-15), ați face:

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

cu toate acestea, devine mai scump pe măsură ce trecem din ce în ce mai mult în lista de rezultate. De fiecare dată când facem unul dintre aceste apeluri, reluăm operațiunea de căutare, forțând-o pe Lucene să plece și să re-înscrie toate rezultatele, să le clasifice și apoi să arunce primele 10 (sau 10000 dacă ajungem atât de departe). Opțiunea mai ușoară este API-ul scan and scroll. Ideea este de a rula interogarea reală o dată și apoi Elastic cache rezultatul undeva și ne dă un “jeton de acces” pentru a merge înapoi și a le obține. Apoi vom apela API scroll endpoint cu jetonul menționat pentru a obține următoarea pagină de rezultate.

pentru a utiliza derularea, cererea inițială de căutare ar trebui să specifice parametrul de defilare în șirul de interogare, care spune Elasticsearch cât timp ar trebui să păstreze “contextul de căutare” în viață, de exemplu ?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" } }}'

rezultatul din cererea de mai sus include un _scroll_id, care ar trebui să fie trecut la API scroll pentru a prelua următorul lot de rezultate.

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

parametrul dimensiune vă permite să configurați numărul maxim de accesări care trebuie returnate cu fiecare lot de rezultate. Fiecare apel către API-ul de defilare returnează următorul lot de rezultate până când nu mai există rezultate rămase pentru a reveni, adică matricea de accesări este goală. Câteva puncte importante de luat în considerare în ceea ce privește API-ul Scroll și Scan sunt următoarele:

  • cererea inițială de căutare și fiecare cerere de derulare ulterioară returnează un nou _scroll_id , ar trebui să se utilizeze numai cel mai recent _scroll_id.
  • dacă cererea specifică agregări, numai răspunsul inițial de căutare va conține rezultatele agregărilor.
  • cererile de derulare au optimizări care le fac mai rapide atunci când ordinea de sortare este _doc. Dacă doriți să iterați peste toate documentele indiferent de comandă, aceasta este cea mai eficientă opțiune:

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

căutare Context

parametrul scroll indică Elasticsearch cât timp ar trebui să mențină viu contextul de căutare. Valoarea sa (de exemplu, 1m) nu trebuie să fie suficient de lungă pentru a procesa toate datele, trebuie doar să fie suficient de lungă pentru a procesa lotul anterior de rezultate. Fiecare solicitare de derulare stabilește un nou timp de expirare.

Clear Scroll API

Context de căutare sunt eliminate automat atunci când timeout defilare a fost depășită. Cu toate acestea păstrarea suluri deschise are un cost (discutat mai târziu în secțiunea de performanță), astfel încât suluri ar trebui să fie eliminate în mod explicit, de îndată ce scroll nu mai este utilizat folosind clear-scroll API:

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

ID-uri de defilare Multiple pot fi transmise ca matrice:

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

toate contextele de căutare pot fi șterse cu parametrul _all:

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

Scroll feliat

interogări de defilare care returnează o mulțime de documente pot fi împărțite în mai multe felii care pot fi consumate independent:

 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" } }}'

rezultatul din prima cerere returnează documentele care aparțin primei felii (id: 0), iar rezultatul din a doua cerere returnează documentele care aparțin celei de-a doua felii. Deoarece numărul maxim de felii este setat la 2, unirea rezultatelor celor două solicitări este echivalentă cu rezultatele unei interogări de defilare fără feliere.

implicit divizarea se face mai întâi pe cioburi și apoi local pe fiecare fragment folosind câmpul _uid cu următoarea formulă:

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

considerații de performanță:

Scroll API : Procesul de îmbinare a fundalului optimizează indexul prin îmbinarea segmentelor mai mici pentru a crea noi segmente mai mari, moment în care segmentele mai mici sunt șterse. Acest proces continuă în timpul derulării, dar un context de căutare deschis împiedică ștergerea segmentelor vechi în timp ce acestea sunt încă în uz. Acesta este modul în care Elasticsearch este capabil să returneze rezultatele cererii inițiale de căutare, indiferent de modificările ulterioare ale documentelor.

păstrarea segmentelor mai vechi în viață înseamnă că sunt necesare mai multe mânere de fișiere. Asigurați-vă că nodurile au fost configurate pentru a avea ample mânere de fișiere gratuite și scroll context API este șters la scurt timp după preluarea datelor.

putem verifica câte contexte de căutare sunt deschise cu API-ul nodes stats:

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

prin urmare, este foarte necesar să ștergeți contextul API Scroll așa cum este descris mai devreme în secțiunea Clear Scroll API.

API de defilare feliată : Dacă numărul de felii este mai mare decât numărul de cioburi filtrul slice este foarte lent la primele apeluri, are o complexitate de O(N) și un cost de memorie egal cu N biți pe felie unde N este numărul total de documente din fragment. După câteva apeluri, filtrul ar trebui să fie memorat în cache, iar apelurile ulterioare ar trebui să fie mai rapide, dar ar trebui să limitați numărul de interogări tăiate pe care le efectuați în paralel pentru a evita explozia memoriei.

notă: numărul maxim de felii permise pe defilare este limitat la 1024 și poate fi actualizat folosind setarea index index.max_slices_per_scroll pentru a ocoli această limită.

pentru a evita acest cost în întregime, este posibil să se utilizeze doc_values de un alt câmp pentru a face feliere, dar utilizatorul trebuie să se asigure că câmpul are următoarele proprietăți:

  • câmpul este numeric.
  • doc_values sunt activate pe acel câmp
  • fiecare document trebuie să conțină o singură valoare. Dacă un document are mai multe valori pentru câmpul specificat, se utilizează prima valoare.
  • valoarea pentru fiecare document trebuie setată o singură dată când documentul este creat și nu este actualizat niciodată. Acest lucru asigură că fiecare felie obține rezultate deterministe.
  • cardinalitatea câmpului ar trebui să fie ridicată. Acest lucru asigură că fiecare felie primește aproximativ aceeași cantitate de documente.

câmpul “Data” servește în mod natural deasupra proprietăților și astfel poate fi utilizat pentru feliere:

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" } }}'

încercați Qbox Hosted Elasticsearch

este ușor să rotiți un cluster Elasticsearch găzduit standard pe oricare dintre centrele noastre de date 47 Rackspace, Softlayer sau Amazon. Și acum Puteți furniza propriile credite AWS pe Qbox private hosted Elasticsearch.

întrebări? Scrie-ne o notă, și vă vom primi un răspuns prompt.

încă nu te bucuri de beneficiile unei căutări găzduite de întreprinderi Elk-stack pe Qbox? Vă invităm să vă creați un cont astăzi și să descoperiți cât de ușor este să vă gestionați și să vă scalați mediul Elasticsearch în serviciul nostru de Găzduire cloud.

Lasă un răspuns

Adresa ta de email nu va fi publicată.