efektivní vyhledávání a načítání velkých datových souborů v Elasticsearch

pro tento příspěvek budeme používat hostovaný Elasticsearch Qbox.io. můžete se zaregistrovat nebo spustit cluster zde, nebo klikněte na tlačítko “Začínáme” v záhlaví navigace. Pokud potřebujete pomoc s nastavením, viz ” poskytování clusteru Qbox Elasticsearch.”

náš cíl

Qbox poskytuje řešení na klíč pro Elasticsearch, Kibana a mnoho Elasticsearch analýzy a monitorování pluginů. Cílem tutoriálu je použít Qbox k prokázání načítání velkých kusů dat pomocí požadavků na skenování a posouvání. Nastavili jsme Logstash v samostatném uzlu / stroji, abychom shromáždili Twitter stream a použili Qbox poskytnutý Elasticsearch k hraní kolem výkonného rozhraní Scan and Scroll API.

naše nastavení zásobníku ELK má tři hlavní komponenty:

  • Elasticsearch: Používá se k ukládání všech protokolů aplikací a monitorování (poskytnutých Qboxem).
  • Logstash: komponenta serveru, která zpracovává příchozí protokoly a kanály do ES.
  • Kibana(volitelné): Webové rozhraní pro vyhledávání a vizualizaci protokolů (poskytnuté Qboxem).

předpoklady

množství CPU, RAM a úložiště, které bude váš server Elasticsearch vyžadovat, závisí na objemu protokolů, které chcete shromáždit. Pro tento tutoriál budeme používat Qbox poskytnutý Elasticsearch s následujícími minimálními specifikacemi:

  • poskytovatel: AWS
  • verze: 5.1.1
  • RAM: 1GB
  • CPU: vCPU1
  • repliky: 0

výše uvedené specifikace lze změnit podle požadovaných požadavků. Vyberte prosím příslušná jména, verze, regiony pro vaše potřeby. Pro tento příklad jsme použili Elasticsearch verze 5.1.1, nejnovější verze je 5.3. Podporujeme všechny verze Elasticsearch na Qbox. (Chcete-li se dozvědět více o hlavních rozdílech mezi 2.x a 5.X, klikněte zde.

kromě našeho serveru Elasticsearch budeme vyžadovat samostatný server logstash pro zpracování příchozího proudu twitter z rozhraní twitter API a jejich odeslání do Elasticsearch. Pro jednoduchost a testovací účely může Server logstash fungovat také jako samotný klientský server. Koncový bod a transportní adresy pro náš cluster Elasticsearch poskytnutý Qbox jsou následující:

common_1.png

koncový bod: REST API

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

autentizace

  • uživatelské jméno = ec18487808b6908009d3
  • heslo = efcec6a1e0

doprava (nativní JAVA)

eb843037.qb0x.com:30543

Poznámka: Ujistěte se, že jste whitelist IP serveru logstash server z clusteru Qbox Elasticsearch.

nainstalujte Logstash

stáhněte a nainstalujte veřejný podpisový klíč:

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

použijeme Logstash version 2.4.x jako kompatibilní s naším Elasticsearch version 5.1.x. Elastická matice podpory produktu Společenství může být odkázána, aby se odstranily jakékoli problémy s verzí.

přidejte definici úložiště do /etc/apt / sources.seznam souborů:

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

spusťte aktualizaci sudo apt-get a úložiště je připraveno k použití. Můžete jej nainstalovat pomocí:

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

alternativně lze logstash tar také stáhnout z webu Elastic Product Releases. Pak, kroky Nastavení a spuštění logstash jsou velmi jednoduché:

  • stáhněte a rozbalte Logstash
  • připravte logstash.conf konfigurační soubor
  • spusťte bin/logstash -f logstash.conf -t a zkontrolujte config (logstash.conf)
  • spustit bin/logstash -f logstash.conf

konfigurace Logstash (Twitter Stream)

konfigurační soubory Logstash jsou ve formátu JSON a jsou umístěny v /etc/logstash/conf.d. Konfigurace se skládá ze tří částí: vstupy, filtry a výstupy.

musíme být oprávněni přijímat data z Twitteru prostřednictvím jeho API. Tato část je snadná:

  1. přihlaste se ke svému účtu Twitter
  2. přejděte na https://dev.twitter.com/apps/
  3. vytvořte novou aplikaci Twitter (Zde Dávám Twitter-Qbox-Stream jako název aplikace).

t1.png

po úspěšném vytvoření aplikace Twitter získáte následující parametry v části “klíče a přístupové tokeny”:

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

t2.png

nyní jsme připraveni vytvořit datovou cestu Twitter (stream) ze serverů Twitter do našeho počítače. Použijeme výše uvedené čtyři parametry (consumer key, consumer secret, access token, access token secret) ke konfiguraci vstupu twitter pro logstash.

pojďme vytvořit konfigurační soubor s názvem 02-twitter-input.conf a nastavit náš” twitter ” vstup:

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

vložte následující vstupní konfiguraci:

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

Uložte a ukončete soubor 02-twitter-input.conf.

to určuje vstup twitter, který bude filtrovat tweety s klíčovými slovy “mobile”, “java”, “android”, “elasticsearch”, “search”a předat je logstash výstupu. Uložit a ukončit. Nakonec vytvoříme konfigurační soubor s názvem 30-elasticsearch-output.conf:

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

vložte následující výstupní konfiguraci:

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

Uložit a ukončit. Tento výstup v podstatě konfiguruje Logstash pro ukládání dat protokolů twitter V Elasticsearch, který běží na https://eb843037.qb0x.com:30024/, v indexu pojmenovaném po Twitteru.

pokud jste si stáhli logstash tar nebo zip, můžete vytvořit logstash.conf soubor má vstup, filtr a výstup vše na jednom místě.

sudo vi LOGSTASH_HOME/logstash.conf

vložte do logstash následující konfiguraci vstupu a výstupu.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 }}

Otestujte konfiguraci Logstash pomocí tohoto příkazu:

sudo service logstash configtest

měl by zobrazit konfiguraci OK, pokud nejsou žádné chyby syntaxe. V opačném případě zkuste přečíst chybový výstup a zjistit, co se děje s konfigurací Logstash.

restartujte Logstash a povolte jej, abyste provedli změny konfigurace:

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

pokud jste si stáhli logstash tar nebo zip, lze jej spustit pomocí následujícího příkazu

bin/logstash -f logstash.conf

jsou přijaty četné odpovědi. Struktura dokumentu je následující:

{ "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 umožňuje stránkování přidáním velikosti a parametru from. Například pokud jste chtěli načíst výsledky v dávkách 5 počínaje 3. stránkou (tj. zobrazit výsledky 11-15), udělali byste:

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

stává se však dražší, jak se pohybujeme dále a dále do seznamu výsledků. Pokaždé, když provedeme jeden z těchto hovorů, znovu spustíme vyhledávací operaci, nutíme Lucene, aby odešel a přehodnotil všechny výsledky, ohodnotil je a poté zlikvidoval prvních 10 (nebo 10000, pokud se dostaneme tak daleko). Snadnější možností je skenování a rolování API. Cílem je spustit skutečný dotaz jednou a pak Elastic ukládá výsledek někde a dává nám “přístupový token”, abychom se vrátili a dostali je. Poté zavoláme koncový bod scroll API s uvedeným tokenem, abychom získali další stránku výsledků.

aby bylo možné použít rolování, měl by počáteční požadavek na vyhledávání specifikovat parametr scroll v řetězci dotazu ,který říká Elasticsearch, jak dlouho by měl udržovat “kontext vyhledávání” naživu, např.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" } }}'

výsledek z výše uvedeného požadavku obsahuje _scroll_id, který by měl být předán rozhraní scroll API, aby bylo možné načíst další dávku výsledků.

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

parametr velikost umožňuje nastavit maximální počet zásahů, které mají být vráceny s každou dávkou výsledků. Každé volání na scroll API vrací další dávku výsledků, dokud nejsou k dispozici žádné další výsledky, tj. Několik důležitých bodů, které je třeba zvážit, pokud jde o Scroll and Scan API, je následující:

  • počáteční požadavek na vyhledávání a každý následující požadavek na posouvání vrátí nový _scroll_id, měl by být použit pouze nejnovější _scroll_id.
  • pokud požadavek specifikuje agregace, pouze počáteční odpověď vyhledávání bude obsahovat výsledky agregací.
  • požadavky na posouvání mají optimalizace, díky nimž jsou rychlejší, když je pořadí řazení _doc. Pokud chcete iterovat všechny dokumenty bez ohledu na pořadí, je to nejúčinnější volba:
curl -XGET 'ES_HOST:ES_PORT/_search?scroll=1m&pretty' -H 'Content-Type: application/json' -d '{ "sort": }'

kontext vyhledávání

parametr scroll říká Elasticsearch, jak dlouho by měl udržovat kontext vyhledávání naživu. Jeho hodnota (např. 1m) nemusí být dostatečně dlouhá na to, aby zpracovala všechna data, ale musí být dostatečně dlouhá na to, aby zpracovala předchozí dávku výsledků. Každý požadavek posouvání nastaví nový čas vypršení platnosti.

Clear Scroll API

kontext vyhledávání se automaticky odstraní, když byl překročen časový limit posouvání. Udržování otevřených svitků má však náklady (diskutováno později v části výkon), takže svitky by měly být explicitně vymazány, jakmile se svitek již nepoužívá pomocí API clear-scroll:

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

více scroll ID může být předán jako pole:

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

všechny vyhledávací kontexty lze vymazat pomocí parametru _all:

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

Sliced Scroll

Scroll dotazy, které vracejí mnoho dokumentů, lze rozdělit na více řezů, které lze spotřebovat nezávisle:

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

výsledek z prvního požadavku vrací dokumenty, které patří do prvního řezu (id: 0) a výsledek z druhého požadavku vrací dokumenty, které patří do druhého řezu. Vzhledem k tomu, že maximální počet řezů je nastaven na 2, je spojení výsledků obou požadavků rovnocenné výsledkům posuvného dotazu bez krájení.

ve výchozím nastavení se dělení provádí nejprve na střepech a poté lokálně na každém střepu pomocí pole _uid s následujícím vzorcem:

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

úvahy o výkonu:

Scroll API : Proces sloučení pozadí optimalizuje index sloučením menších segmentů za účelem vytvoření nových větších segmentů, kdy jsou menší segmenty odstraněny. Tento proces pokračuje během posouvání, ale otevřený kontext vyhledávání zabraňuje odstranění starých segmentů, zatímco se stále používají. Takto Je Elasticsearch schopen vrátit výsledky počátečního požadavku na vyhledávání bez ohledu na následné změny dokumentů.

udržování starších segmentů naživu znamená, že je zapotřebí více úchytů souborů. Ujistěte se, že uzly byly nakonfigurovány tak, aby měly dostatek volných úchytů souborů a kontext scroll API je vymazán brzy po načtení dat.

můžeme zkontrolovat, kolik vyhledávací kontexty jsou otevřeny s uzly statistiky API:

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

je tedy velmi nutné vymazat kontext rozhraní Scroll API, jak je popsáno výše v sekci Clear Scroll API.

Sliced Scroll API : Pokud je počet řezů větší než počet střepů, filtr řezu je při prvních hovorech velmi pomalý, má složitost O (N) A náklady na paměť se rovnají n bitům na řez, kde N je celkový počet dokumentů ve střepu. Po několika hovorech by měl být filtr uložen do mezipaměti a následné hovory by měly být rychlejší, ale měli byste omezit počet řezaných dotazů, které provádíte paralelně, aby nedošlo k výbuchu paměti.

Poznámka: maximální počet povolených řezů na svitek je omezen na 1024 a lze jej aktualizovat pomocí nastavení indexu index.max_slices_per_scroll, aby se tento limit obešel.

Chcete-li se zcela vyhnout těmto nákladům, je možné použít doc_values jiného pole k řezání, ale uživatel musí zajistit, aby pole mělo následující vlastnosti:

  • pole je číselné.
  • doc_values jsou povoleny v tomto poli
  • každý dokument by měl obsahovat jednu hodnotu. Pokud má dokument pro zadané pole více hodnot, použije se první hodnota.
  • hodnota pro každý dokument by měla být nastavena jednou, když je dokument vytvořen a nikdy aktualizován. Tím je zajištěno, že každý řez dostane deterministické výsledky.
  • kardinálnost pole by měla být vysoká. Tím je zajištěno, že každý řez dostane přibližně stejné množství dokumentů.

pole “Datum” přirozeně slouží výše uvedeným vlastnostem a lze jej tedy použít pro krájení:

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

Vyzkoušejte Qbox hostovaný Elasticsearch

je snadné roztočit standardní hostovaný Cluster Elasticsearch na kterémkoli z našich 47 datových center Rackspace, Softlayer nebo Amazon. A nyní můžete poskytnout své vlastní Kredity AWS na Qbox Private Hosted Elasticsearch.

otázky? Napište nám poznámku, a my vám dáme rychlou odpověď.

ještě se těší výhody hostované ELK-stack enterprise search na Qbox? Zveme Vás k vytvoření účtu ještě dnes a zjistíte, jak snadné je spravovat a škálovat prostředí Elasticsearch v naší cloudové hostingové službě.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.