nagy adatkészletek keresése és lekérése az Elasticsearch-ben hatékonyan

ehhez a bejegyzéshez a hosztolt Elasticsearch-et fogjuk használni Qbox.io. itt regisztrálhat vagy elindíthatja a klasztert, vagy kattintson a fejléc navigációjában az “első lépések” gombra. Ha segítségre van szüksége a beállításhoz, olvassa el a “Qbox Elasticsearch fürt létrehozása.”

célunk

a Qbox kulcsrakész megoldást kínál az Elasticsearch, Kibana és sok Elasticsearch elemző és megfigyelő plugin számára. A cél a bemutató az, hogy használja Qbox bizonyítani lekérése nagy darab adatok segítségével szkennelési és Scroll kéréseket. A Logstash-t egy külön csomópontban/gépen állítottuk be, hogy összegyűjtsük a Twitter stream-et, és a Qbox által biztosított Elasticsearch segítségével játszhassunk az erőteljes Scan and Scroll API körül.

ELK stack beállításunk három fő összetevőből áll:

  • Elasticsearch: az összes alkalmazás és megfigyelési napló tárolására szolgál(a Qbox által biztosított).
  • Logstash: a kiszolgáló összetevő, amely feldolgozza a bejövő naplókat és táplálja az ES-t.
  • Kibana(opcionális): Webes felület a naplók keresésére és megjelenítésére (a Qbox által biztosított).

előfeltételek

az Elasticsearch kiszolgáló által igényelt CPU, RAM és tárhely mennyisége a begyűjteni kívánt naplók mennyiségétől függ. Ehhez az oktatóanyaghoz egy Qbox által biztosított Elasticsearch-et fogunk használni a következő minimális specifikációkkal:

  • Szolgáltató: AWS
  • Verzió: 5.1.1
  • RAM: 1GB
  • CPU: vCPU1
  • replikák: 0

a fenti specifikációk megváltoztathatók a kívánt követelmények szerint. Kérjük, válassza ki az Ön igényeinek megfelelő neveket, verziókat, régiókat. Ebben a példában az Elasticsearch 5.1.1 verzióját használtuk, a legfrissebb verzió az 5.3. Támogatjuk az Elasticsearch összes verzióját a Qbox-on. (Ha többet szeretne megtudni a főbb különbségekről 2.x és 5.x, kattints ide.)

az Elasticsearch szerveren kívül külön logstash szerverre lesz szükségünk a Twitter API-ból érkező twitter-adatfolyam feldolgozásához és az Elasticsearch-be történő szállításhoz. Az egyszerűség és a tesztelés érdekében a logstash szerver maga is ügyfélszerverként működhet. A Qbox által biztosított Elasticsearch fürt végponti és szállítási címei a következők:

common_1.png

végpont: REST API

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

hitelesítés

  • felhasználónév = ec18487808b6908009d3
  • jelszó = efcec6a1e0

szállítás (natív JAVA)

eb843037.qb0x.com:30543

Megjegyzés: Kérjük, győződjön meg róla, hogy engedélyezőlistára a logstash szerver IP QBox Elasticsearch cluster.

Install Logstash

töltse le és telepítse a nyilvános aláíró kulcsot:

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

fogjuk használni a Logstash version 2.4.xkompatibilis a Elasticsearch version 5.1.x. A rugalmas közösségi terméktámogatási mátrix hivatkozható A verziókkal kapcsolatos problémák tisztázása érdekében.

adja hozzá a repository definíciót az /etc/apt/sources állományhoz.lista fájl:

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

futtassa a sudo apt-get frissítést, és az adattár készen áll a használatra. Telepítheti azt:

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

Alternatív megoldásként a logstash tar letölthető az Elastic Product Releases webhelyről is. Ezután a logstash beállításának és futtatásának lépései meglehetősen egyszerűek:

  • töltse le és csomagolja ki a Logstash
  • készítsen elő egy logstash.conf konfigurációs fájlt
  • futtassa a bin/logstash -f logstash.conf -t parancsot a config (logstash) ellenőrzéséhez.conf)
  • Futtatás bin/logstash -f logstash.conf

a Logstash konfigurálása (Twitter Stream)

a Logstash konfigurációs fájljai JSON formátumban vannak, és /etc/logstash/conf.dformátumban vannak. A konfiguráció három részből áll: bemenetek, szűrők és kimenetek.

engedélyt kell kapnunk arra, hogy adatokat vehessünk a Twitterről az API-n keresztül. Ez a rész könnyű:

  1. jelentkezzen be Twitter-fiókjába
  2. Ugrás https://dev.twitter.com/apps/
  3. hozzon létre egy új Twitter alkalmazást (itt adom a Twitter-Qbox-Stream-et az alkalmazás neveként).

t1.png

miután sikeresen létrehozta a Twitter alkalmazást, a következő paramétereket kapja meg a “kulcsok és hozzáférési tokenek “részben”:

  1. fogyasztói kulcs (API kulcs)
  2. fogyasztói titok (API titok)
  3. hozzáférési Token
  4. hozzáférési Token titkos

t2.png

most készen állunk a Twitter adatútvonalának (stream) létrehozására a Twitter szerverekről a gépünkre. A fenti négy paramétert (fogyasztói kulcs, fogyasztói titok, hozzáférési token, hozzáférési token titkos) fogjuk használni a twitter bevitelének konfigurálásához a logstash számára.

hozzunk létre egy 02-twitter-input.conf nevű konfigurációs fájlt, és állítsuk be a “twitter” bemenetet:

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

helyezze be a következő bemeneti konfigurációt:

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

mentse és lépjen ki a 02-twitter-input.conf fájlból.

ez egy olyan twitter bemenetet határoz meg, amely a “mobile”, “java”, “android”, “elasticsearch”, “search” kulcsszavakkal szűri a tweeteket, és továbbítja azokat a logstash kimenetre. Mentés és kilépés. Végül létrehozunk egy konfigurációs fájlt30-elasticsearch-output.conf:

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

helyezze be a következő kimeneti konfigurációt:

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

mentés és kilépés. Ez a kimenet alapvetően úgy konfigurálja a Logstash-t, hogy tárolja a twitter naplók adatait az Elasticsearch-ben, amely https://eb843037.qb0x.com:30024/ címen fut, a Twitterről elnevezett indexben.

ha letöltötte logstash tar vagy zip, létrehozhat egy logstash.conf fájl, amely input, filter és output minden egy helyen.

sudo vi LOGSTASH_HOME/logstash.conf

helyezze be a következő bemeneti és kimeneti konfigurációt a logstash-ba.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 }}

tesztelje a Logstash konfigurációt ezzel a paranccsal:

sudo service logstash configtest

meg kell jelennie konfiguráció OK, ha nincsenek szintaktikai hibák. Ellenkező esetben próbálja meg elolvasni a hiba kimenetét, hogy megnézze, mi a baj a Logstash konfigurációval.

indítsa újra a Logstash-t, és engedélyezze, hogy a konfigurációs változások életbe lépjenek:

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

ha letöltötte logstash tar vagy zip, lehet futtatni a következő parancsot

bin/logstash -f logstash.conf

számos válasz érkezik. A dokumentum szerkezete a következő:

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

az Elasticsearch lehetővé teszi a lapszámozást Egy méret és egy from paraméter hozzáadásával. Például, ha az eredményeket 5-ös tételekben szeretné letölteni a 3. oldaltól kezdve (azaz az eredmények megjelenítése 11-15), akkor ezt tenné:

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

azonban egyre drágább lesz, ahogy egyre tovább haladunk az eredmények listáján. Minden alkalommal, amikor egy ilyen hívást kezdeményezünk, újra futtatjuk a keresési műveletet, arra kényszerítve Lucene-t, hogy menjen el, és újra pontozza az összes eredményt, rangsorolja őket, majd dobja el az első 10-et (vagy 10000-et, ha ilyen messzire jutunk). A legegyszerűbb megoldás a scan and scroll API. Az ötlet az, hogy futtassa a tényleges lekérdezést egyszer, majd rugalmas cache az eredmény valahol, és ad nekünk egy “hozzáférési token”, hogy menjen vissza, és kap őket. Ezután hívjuk a scroll API végpontot az említett tokennel, hogy megkapjuk az eredmények következő oldalát.

a görgetés használatához a kezdeti Keresési kérésnek meg kell adnia a görgetési paramétert a lekérdezési karakterláncban, amely megmondja az Elasticsearch-nek, hogy mennyi ideig kell életben tartania a “keresési kontextust”, pl. ?görgetés=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" } }}'

a fenti kérés eredménye tartalmaz egy _scroll_id-t, amelyet át kell adni a scroll API-nak a következő eredménycsomag lekérése érdekében.

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

a size paraméter lehetővé teszi, hogy beállítsa a találatok maximális számát, amelyeket minden egyes eredménycsomaghoz vissza kell adni. Minden hívás a scroll API visszaadja a következő tétel az eredmények, amíg nincs több eredmény maradt vissza, azaz a találatok tömb üres. Néhány fontos szempont, amelyet figyelembe kell venni a Scroll and Scan API-val kapcsolatban, a következők:

  • a kezdeti keresési kérelem és minden további görgetési kérelem új _scroll_id értéket ad vissza, csak a legfrissebb _scroll_id-t kell használni.
  • ha a kérés összesítéseket ad meg, akkor csak a kezdeti keresési válasz tartalmazza az összesítések eredményeit.
  • a görgetési kérelmek optimalizálása gyorsabb, ha a rendezési sorrend _doc. Ha a megrendeléstől függetlenül az összes dokumentumot meg akarja ismételni, ez a leghatékonyabb lehetőség:

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

Keresési kontextus

a görgetési paraméter megmondja az Elasticsearch-nek, hogy mennyi ideig kell életben tartania a keresési kontextust. 1M) értékének nem kell elég hosszúnak lennie az összes adat feldolgozásához, csak elég hosszúnak kell lennie az előző eredménycsomag feldolgozásához. Minden görgetési kérelem új lejárati időt állít be.

Scroll API törlése

a keresési környezet automatikusan eltávolításra kerül, ha túllépte a görgetési időt. A tekercsek nyitva tartásának azonban költsége van (ezt később a teljesítmény részben tárgyaljuk), ezért a tekercseket kifejezetten törölni kell, amint a tekercset már nem használják a clear-scroll API használatával:

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

több görgetési azonosítót lehet átadni tömbként:

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

minden Keresési környezet törölhető a _all paraméterrel:

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

szeletelt görgetés

a sok dokumentumot visszaadó görgetési lekérdezések több szeletre oszthatók, amelyek egymástól függetlenül fogyaszthatók:

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

az első kérés eredménye az első szelethez tartozó dokumentumokat (id: 0), a második kérés eredménye pedig a második szelethez tartozó dokumentumokat adja vissza. Mivel a szeletek maximális száma 2, a két kérés eredményeinek egyesítése megegyezik a szeletelés nélküli görgetési lekérdezés eredményeivel.

alapértelmezés szerint a felosztás először a szilánkokon, majd helyileg minden szilánkon történik a _uid mező segítségével a következő képlettel:

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

teljesítmény szempontok:

Scroll API : A háttér-egyesítési folyamat optimalizálja az indexet a kisebb szegmensek egyesítésével új nagyobb szegmensek létrehozásához, ekkor a kisebb szegmensek törlődnek. Ez a folyamat a görgetés során folytatódik, de a nyitott Keresési környezet megakadályozza a régi szegmensek törlését, amíg még használatban vannak. Az Elasticsearch így képes visszaadni a kezdeti keresési kérelem eredményeit, függetlenül a dokumentumok későbbi módosításaitól.

a régebbi szegmensek életben tartása azt jelenti, hogy több fájlkezelőre van szükség. Győződjön meg arról, hogy a csomópontok úgy vannak konfigurálva, hogy bőséges ingyenes fájlfogantyúkkal rendelkezzenek, és a scroll API kontextus hamarosan törlődik az Adatok lekérése után.

a nodes stats API segítségével ellenőrizhetjük, hogy hány Keresési kontextus van nyitva:

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

ezért nagyon szükséges a Scroll API kontextusának törlése, amint azt korábban a Scroll API törlése szakaszban leírtuk.

szeletelt Scroll API : Ha a szeletek száma nagyobb, mint a szilánkok száma, akkor a szeletszűrő nagyon lassú az első híváskor, összetettsége O(N), memóriaköltsége pedig N bit szeletenként, ahol N A szilánkban lévő dokumentumok teljes száma. Néhány hívás után a szűrőt gyorsítótárba kell helyezni, a későbbi hívásoknak pedig gyorsabbnak kell lenniük, de a memóriarobbanás elkerülése érdekében korlátozni kell a párhuzamosan végrehajtott szeletelt lekérdezések számát.

megjegyzés: a görgetésenként megengedett szeletek maximális száma 1024-re korlátozódik, és a index.max_slices_per_scroll index beállítással frissíthető a korlát megkerüléséhez.

ennek a költségnek a teljes elkerülése érdekében lehetőség van egy másik mező doc_values használatára a szeleteléshez, de a felhasználónak gondoskodnia kell arról, hogy a mező a következő tulajdonságokkal rendelkezzen:

  • a mező numerikus.
  • doc_values engedélyezve vannak ezen a mezőn
  • minden dokumentumnak egyetlen értéket kell tartalmaznia. Ha egy dokumentumnak több értéke van a megadott mezőhöz, akkor az első értéket kell használni.
  • az egyes dokumentumok értékét egyszer kell beállítani a dokumentum létrehozásakor, és soha nem kell frissíteni. Ez biztosítja, hogy minden szelet determinisztikus eredményeket kapjon.
  • a mező kardinalitásának magasnak kell lennie. Ez biztosítja, hogy minden szelet megközelítőleg azonos mennyiségű dokumentumot kapjon.

a “dátum” mező természetesen a fenti tulajdonságokat szolgálja, így szeletelésre használható:

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

próbálja Qbox házigazdája Elasticsearch

ez könnyen spin fel egy szabványos házigazdája Elasticsearch klaszter bármelyik 47 Rackspace, Softlayer, vagy az Amazon adatközpontok. Most pedig saját AWS-krediteket biztosíthat a Qbox Private Hosted Elasticsearch-en.

kérdések? Írj nekünk egy megjegyzést, és gyors választ kapunk.

még nem élvezi a hosztolt ELK-stack vállalati keresés előnyeit a Qbox-on? Meghívjuk Önt, hogy hozzon létre egy fiókot még ma, és fedezze fel, milyen egyszerű kezelni és méretezni az Elasticsearch környezetet a felhő hosting szolgáltatásunkban.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.