efficiënt zoeken en ophalen van grote Datasets in Elasticsearch

Qbox.io. u kunt zich hier aanmelden of uw cluster starten, of klik op “aan de slag” in de header navigatie. Als je hulp nodig hebt bij het instellen, refereer je naar ” Provisioning a Qbox Elasticsearch Cluster.”

ons doel

Qbox biedt een turnkey oplossing voor Elasticsearch, Kibana en veel van Elasticsearch analyse en monitoring plugins. Het doel van de tutorial is om Qbox te gebruiken om het ophalen van grote stukken gegevens te demonstreren met behulp van een Scan-en Scrollverzoeken. We zetten Logstash in een aparte node / machine om Twitter-stream te verzamelen en Qbox provisioned Elasticsearch te gebruiken om de krachtige Scan en Scroll API te spelen.

onze elk stack setup bestaat uit drie hoofdcomponenten:

  • Elasticsearch: het wordt gebruikt om alle applicatie-en monitoringlogboeken op te slaan(voorzien door Qbox).
  • Logstash: het serveronderdeel dat inkomende logboeken en feeds naar ES verwerkt.
  • Kibana(facultatief): Een webinterface voor het zoeken en visualiseren van logs (voorzien door Qbox).

vereisten

de hoeveelheid CPU, RAM en opslag die uw Elasticsearch-Server nodig heeft, hangt af van het volume van de logs die u wilt verzamelen. Voor deze tutorial, zullen we gebruik maken van een Qbox provisioned Elasticsearch met de volgende minimale specificaties:

  • Provider: AWS
  • versie: 5.1.1
  • RAM: 1GB
  • CPU: vCPU1
  • replica ‘ s: 0

de bovenstaande specificaties kunnen worden gewijzigd volgens uw gewenste eisen. Selecteer de juiste namen, versies, regio ‘ s voor uw behoeften. Voor dit voorbeeld gebruikten we Elasticsearch versie 5.1.1, de meest recente versie is 5.3. Wij ondersteunen alle versies van Elasticsearch op Qbox. (Om meer te leren over de belangrijkste verschillen tussen 2.x en 5.x, Klik hier.)

naast onze Elasticsearch-Server hebben we een aparte logstash-server nodig om binnenkomende twitter-stream van twitter API te verwerken en te verzenden naar Elasticsearch. Voor eenvoud en testdoeleinden kan de logstash-server ook fungeren als de ClientServer zelf. De Endpoint-en Transportadressen voor onze Qbox provisioned Elasticsearch cluster zijn als volgt:

gemeenschappelijk_1.png

Eindpunt: REST API

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

Authenticatie

  • Gebruikersnaam = ec18487808b6908009d3
  • Wachtwoord = efcec6a1e0

VERVOER (NATIVE JAVA)

eb843037.qb0x.com:30543

Opmerking: zorg ervoor dat de witte lijst van de logstash server IP-adres van Qbox Elasticsearch cluster.

installeer Logstash

Download en installeer de publieke ondertekeningssleutel:

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

we gebruiken de Logstash version 2.4.x als compatibel met onze Elasticsearch version 5.1.x. De Elastic Community Product Support Matrix kan worden doorverwezen om eventuele versieproblemen op te lossen.

voeg de repository definitie toe aan /etc/apt/sources.lijst bestand:

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

voer sudo apt-get update uit en de repository is klaar voor gebruik. U kunt het installeren met:

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

als alternatief, logstash tar kan ook worden gedownload van Elastic Product Releases Site. Dan, de stappen van het opzetten en uitvoeren van logstash zijn vrij eenvoudig:

  • Logstash downloaden en uitpakken
  • Maak een logstash.conf configuratiebestand
  • voer bin/logstash -f logstash.conf -t uit om de configuratie te controleren (logstash.conf)
  • uitgevoerd bin/logstash -f logstash.conf

configureren Logstash (Twitter Stream)

Logstash configuratiebestanden zijn in het JSON-formaat en bevinden zich in /etc/logstash/conf.d. De configuratie bestaat uit drie secties: ingangen, filters en uitgangen.

we moeten gemachtigd zijn om gegevens van Twitter te nemen via de API. Dit deel is makkelijk:

  1. Log in op uw Twitter-account
  2. Ga naar https://dev.twitter.com/apps/
  3. Maak een nieuwe Twitter-applicatie aan (hier geef Ik Twitter-Qbox-Stream als de naam van de app).

t1.png

nadat u de Twitter-toepassing succesvol hebt gemaakt, krijgt u de volgende parameters in “Keys and Access Tokens””:

  1. Consumer Key (API Key)
  2. Consumer Secret (API Secret)
  3. Access Token
  4. Access Token Secret

t2.png

we zijn nu klaar om het Twitter-gegevenspad (stream) van Twitter-servers naar onze machine aan te maken. We zullen de bovenstaande vier parameters (consumer key, consumer secret, access token, access token secret) gebruiken om twitter-invoer voor logstash te configureren.

laten we een configuratiebestand maken met de naam 02-twitter-input.conf en onze “twitter” – invoer instellen:

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

Voer de volgende invoerconfiguratie in:

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

bestand 02-twitter-input.confopslaan en afsluiten.

dit geeft een twitter-ingang aan die tweets filtert met trefwoorden “mobile”, “java”, “android”, “elasticsearch”, “search” en deze doorgeeft aan logstash-uitvoer. Sparen en stoppen. Tot slot zullen we een configuratiebestand maken met de naam 30-elasticsearch-output.conf:

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

Voer de volgende uitvoerconfiguratie in:

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

opslaan en afsluiten. Deze output configureert in principe Logstash om de twitter logs-gegevens op te slaan in Elasticsearch die draait op https://eb843037.qb0x.com:30024/, in een index die vernoemd is naar de twitter.

als u logstash tar of zip hebt gedownload, kunt u een logstash aanmaken.conf-bestand met invoer, filter en uitvoer op één plaats.

sudo vi LOGSTASH_HOME/logstash.conf

Voer de volgende invoer-en uitvoerconfiguratie in logstash in.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 }}

Test uw Logstash configuratie met dit commando:

sudo service logstash configtest

het zou configuratie OK moeten weergeven als er geen syntaxisfouten zijn. Anders, probeer en lees de error output om te zien wat er mis is met uw Logstash configuratie.

herstart Logstash, en activeer het, om onze configuratiewijzigingen door te voeren:

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

als u logstash tar of zip hebt gedownload, kan deze worden uitgevoerd met behulp van het volgende commando

bin/logstash -f logstash.conf

Er worden talrijke antwoorden ontvangen. De structuur van het document is als volgt:

{ "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 maakt paginering mogelijk door het toevoegen van een grootte en een van parameter. Bijvoorbeeld als u resultaten in batches van 5 vanaf de 3e pagina (dwz show results 11-15) wilt ophalen, zou u doen:

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

maar het wordt duurder als we verder en verder in de lijst met resultaten. Elke keer dat we een van deze gesprekken voeren, voeren we de zoekoperatie opnieuw uit, waardoor Lucene gedwongen wordt om alle resultaten opnieuw te scoren, ze te rangschikken en dan de eerste 10 weg te gooien (of 10000 als we zover komen). De gemakkelijkere optie is de scan en scroll API. Het idee is om de werkelijke query een keer uit te voeren en vervolgens Elastic caches het resultaat ergens en geeft ons een “access token” om terug te gaan en ze te krijgen. Dan noemen we de scroll API eindpunt met genoemde token om de volgende pagina van de resultaten te krijgen.

om scrollen te gebruiken, moet de initiële zoekopdracht De scrollparameter in de query string specificeren, die Elasticsearch vertelt hoe lang het de “zoekcontext” in leven moet houden, bijv. ?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" } }}'

het resultaat van het bovenstaande verzoek bevat een _scroll_id, die moet worden doorgegeven aan de scroll API om de volgende partij van de resultaten op te halen.

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

de Parameter Grootte stelt u in staat om het maximum aantal hits te configureren dat moet worden geretourneerd bij elke reeks resultaten. Elke oproep naar de scroll API retourneert de volgende partij van de resultaten totdat er geen resultaten meer over om terug te keren, dat wil zeggen de hits array is leeg. Een paar belangrijke punten te overwegen met betrekking tot Scroll en Scan API zijn als volgt:

  • de eerste zoekopdracht en elke volgende scroll-aanvraag geeft een nieuwe _scroll_id terug, alleen de meest recente _scroll_id mag worden gebruikt.
  • als de aanvraag aggregaties specificeert, bevat alleen het eerste zoekantwoord de resultaten van de aggregaties.
  • Scrollverzoeken hebben optimalisaties die ze sneller maken wanneer de sorteervolgorde _docis. Als u wilt herhalen over alle documenten, ongeacht de volgorde, Dit is de meest efficiënte optie:

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

Zoekcontext

de scrollparameter vertelt Elasticsearch hoe lang het de zoekcontext levend moet houden. De waarde (bijvoorbeeld 1m) hoeft niet lang genoeg te zijn om alle gegevens te verwerken, het moet alleen lang genoeg zijn om de vorige partij resultaten te verwerken. Elke scroll-aanvraag stelt een nieuwe vervaldatum in.

Scroll-API wissen

Zoekcontext wordt automatisch verwijderd wanneer de scroltijd is overschreden. Echter het houden van scrolls open heeft een kosten (besproken later in de performance sectie) dus scrolls moeten expliciet worden gewist zodra de scroll niet meer wordt gebruikt met behulp van de clear-scroll API:

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

meerdere scroll-ID ‘ s kunnen worden doorgegeven als array:

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

alle zoekcontexten kunnen worden gewist met de _alle parameter:

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

Sliced Scroll

Scroll queries die veel documenten opleveren, kunnen worden opgesplitst in meerdere slices die onafhankelijk kunnen worden geconsumeerd:

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

het resultaat van het eerste verzoek retourneert documenten die behoren tot het eerste slice (id: 0) en het resultaat van het tweede verzoek retourneert documenten die behoren tot het tweede slice. Aangezien het maximum aantal slices is ingesteld op 2, is de Vereniging van de resultaten van de twee verzoeken gelijk aan de resultaten van een scroll query zonder slicing.

standaard wordt het splitsen eerst op de scherven gedaan en vervolgens lokaal op elke scherf met behulp van het veld _uid met de volgende formule:

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

Prestatieoverwegingen:

Scroll API : Het proces voor het samenvoegen van de achtergrond optimaliseert de index door kleinere segmenten samen te voegen om nieuwe grotere segmenten te maken, op welk moment de kleinere segmenten worden verwijderd. Dit proces gaat door tijdens het scrollen, maar een open zoekcontext voorkomt dat de oude segmenten worden verwijderd terwijl ze nog steeds in gebruik zijn. Zo kan Elasticsearch de resultaten van de eerste zoekopdracht retourneren, ongeacht latere wijzigingen in documenten.

oudere segmenten in leven houden betekent dat er meer bestandshandvatten nodig zijn. Zorg ervoor dat knooppunten zijn geconfigureerd om voldoende vrije bestandshandvatten te hebben en scroll API context wordt gewist kort na het ophalen van gegevens.

we kunnen controleren hoeveel zoekcontexten open zijn met de nodes stats API:

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

het is dus zeer noodzakelijk om de Scroll API Context te wissen zoals eerder beschreven in Clear Scroll API sectie.

Sliced Scroll API : Als het aantal slices groter is dan het aantal scherven is het slicefilter erg traag bij de eerste aanroepen, het heeft een complexiteit van O(N) en een geheugenkosten is gelijk aan N bits per slice waarbij N het totale aantal documenten in de scherf is. Na enkele gesprekken moet het filter worden gecached en de daaropvolgende gesprekken moeten sneller zijn, maar je moet het aantal gesneden query die u parallel uitvoert beperken om de geheugenexplosie te voorkomen.

opmerking: het maximum aantal slices per scroll is beperkt tot 1024 en kan worden bijgewerkt met de index.max_slices_per_scroll indexinstelling om deze limiet te omzeilen.

om deze kosten volledig te vermijden, is het mogelijk om de doc_values van een ander veld te gebruiken om het snijden uit te voeren, maar de gebruiker moet ervoor zorgen dat het veld de volgende eigenschappen heeft:

  • het veld is numeriek.
  • doc_values zijn ingeschakeld in dat veld
  • elk document moet één enkele waarde bevatten. Als een document meerdere waarden heeft voor het opgegeven veld, wordt de eerste waarde gebruikt.
  • de waarde voor elk document moet eenmaal worden ingesteld wanneer het document wordt aangemaakt en nooit wordt bijgewerkt. Dit zorgt ervoor dat elke schijf deterministische resultaten krijgt.
  • de kardinaliteit van het veld moet hoog zijn. Dit zorgt ervoor dat elke slice ongeveer dezelfde hoeveelheid documenten krijgt.

het veld “date” dient natuurlijk boven de eigenschappen en kan dus worden gebruikt voor het snijden:

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

probeer Qbox Hosted Elasticsearch

het is gemakkelijk om een standaard hosted Elasticsearch cluster op te zetten op een van onze 47 Rackspace, Softlayer of Amazon datacenters. En u kunt nu uw eigen AWS Credits op Qbox Private Hosted Elasticsearch.

vragen? Stuur ons een bericht, en we zorgen voor een snelle reactie.

geniet u nog niet van de voordelen van een hosted elk-stack enterprise search op Qbox? Wij nodigen u uit om vandaag nog een account aan te maken en te ontdekken hoe eenvoudig het is om uw Elasticsearch omgeving te beheren en te schalen in onze cloud hosting service.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.