Wyszukiwanie i pobieranie dużych zbiorów danych w Elasticsearch efektywnie

dla tego postu będziemy używać hosted Elasticsearch na Qbox.io. możesz zarejestrować się lub uruchomić klaster tutaj lub kliknąć “Rozpocznij” w nawigacji w nagłówku. Jeśli potrzebujesz pomocy w konfigurowaniu, zapoznaj się z tematem “udostępnianie klastra Qbox Elasticsearch.”

nasz cel

Qbox zapewnia gotowe rozwiązanie dla Elasticsearch, Kibana i wielu wtyczek do analizy i monitorowania Elasticsearch. Celem samouczka jest użycie Qbox do zademonstrowania pobierania dużych fragmentów danych za pomocą żądań skanowania i przewijania. Skonfigurowaliśmy Logstash w oddzielnym węźle/maszynie, aby zebrać strumień Twittera i użyć QBOX provisioned Elasticsearch, aby bawić się potężnym API skanowania i przewijania.

nasza konfiguracja stosu ELK składa się z trzech głównych komponentów:

  • Elasticsearch: służy do przechowywania wszystkich dzienników aplikacji i monitorowania (obsługiwanych przez Qbox).
  • Logstash: komponent serwera, który przetwarza przychodzące logi i kanały do ES.
  • Kibana(opcjonalnie): Interfejs WWW do wyszukiwania i wizualizacji dzienników (obsługiwany przez Qbox).

wymagania wstępne

ilość procesora, pamięci RAM i miejsca wymaganego przez serwer Elasticsearch zależy od ilości dzienników, które zamierzasz gromadzić. W tym samouczku będziemy używać QBOX provisioned Elasticsearch z następującymi minimalnymi specyfikacjami:

  • dostawca: AWS
  • Wersja: 5.1.1
  • RAM: 1GB
  • CPU: vCPU1
  • repliki: 0

powyższe specyfikacje można zmienić zgodnie z żądanymi wymaganiami. Wybierz odpowiednie nazwy, wersje, regiony dla swoich potrzeb. W tym przykładzie użyliśmy wersji Elasticsearch 5.1.1, najbardziej aktualna wersja to 5.3. Obsługujemy wszystkie wersje Elasticsearch na Qbox. (Aby dowiedzieć się więcej o głównych różnicach między 2.x i 5.X, Kliknij tutaj.)

oprócz naszego serwera Elasticsearch, będziemy potrzebować oddzielnego serwera logstash do przetwarzania przychodzącego strumienia Twittera z interfejsu twitter API i wysyłania go do Elasticsearch. Dla uproszczenia i celów testowych, serwer logstash może również działać jako serwer klienta. Adresy punktów końcowych i adresów transportowych dla naszego klastra Qbox provisioned Elasticsearch są następujące:

common_1.png

Endpoint: REST API

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

uwierzytelnianie

  • nazwa użytkownika = ec18487808b6908009d3
  • hasło = efcec6a1e0

TRANSPORT (natywna JAVA)

eb843037.qb0x.com:30543

Uwaga: Należy dodać do białej listy adres IP serwera logstash z klastra Qbox Elasticsearch.

zainstaluj Logstash

Pobierz i zainstaluj Klucz podpisywania publicznego:

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

użyjemy Logstash version 2.4.x jako zgodnego z naszym Elasticsearch version 5.1.x. Elastyczna Matryca wsparcia produktu Wspólnoty może być skierowana w celu usunięcia wszelkich problemów z wersją.

Dodaj definicję repozytorium do swojego /etc / apt / sources.plik listy:

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

Uruchom sudo apt-get update i repozytorium jest gotowe do użycia. Możesz go zainstalować za pomocą:

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

alternatywnie, Logstash tar można również pobrać ze strony Elastic product Releases. Następnie kroki konfiguracji i uruchomienia logstash są dość proste:

  • Pobierz i rozpakuj Logstash
  • przygotuj plik konfiguracyjny logstash.conf
  • Uruchom bin/logstash -f logstash.conf -t, aby sprawdzić konfigurację (logstash.conf)
  • Uruchom bin/logstash -f logstash.conf

Konfiguracja Logstash (strumień Twittera)

pliki konfiguracyjne Logstash są w formacie JSON i znajdują się w /etc/logstash/conf.d. Konfiguracja składa się z trzech sekcji: wejść, filtrów i wyjść.

musimy być upoważnieni do pobierania danych z Twittera za pośrednictwem jego API. Ta część jest łatwa:

  1. Zaloguj się do swojego konta na Twitterze
  2. przejdź do https://dev.twitter.com/apps/
  3. Utwórz nową aplikację na Twitterze (tutaj podaję Twitter-Qbox-Stream jako nazwę aplikacji).

t1.png

po pomyślnym utworzeniu aplikacji Twitter, otrzymasz następujące parametry w “klucze i tokeny dostępu”:

  1. klucz konsumenta (klucz API)
  2. Tajemnica konsumenta (Tajemnica API)
  3. Token dostępu
  4. sekret Tokena dostępu

t2.png

jesteśmy teraz gotowi do utworzenia ścieżki danych Twittera (strumienia) z serwerów Twittera do naszej maszyny. Użyjemy powyższych czterech parametrów (consumer key, Consumer secret, access token, access token secret), aby skonfigurować wejście Twittera dla logstash.

stwórzmy plik konfiguracyjny o nazwie 02-twitter-input.conf i skonfigurujmy nasze wejście “twitter” :

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

Wstaw następującą konfigurację wejścia:

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

Zapisz i zamknij plik 02-twitter-input.conf.

określa wejście Twittera, które filtruje tweety za pomocą słów kluczowych “mobile”, “java”, “android”, “elasticsearch”, “search” i przekazuje je do wyjścia logstash. Zapisz i zakończ. Na koniec utworzymy plik konfiguracyjny o nazwie 30-elasticsearch-output.conf:

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

Wstaw następującą konfigurację wyjścia:

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

Zapisz i wyjdź. To wyjście zasadniczo konfiguruje Logstash do przechowywania danych dzienników Twittera w Elasticsearch, który działa w https://eb843037.qb0x.com:30024/, w indeksie nazwanym od Twittera.

jeśli pobrałeś Logstash tar lub zip, możesz utworzyć logstash.plik conf z wejściem, filtrem i wyjściem w jednym miejscu.

sudo vi LOGSTASH_HOME/logstash.conf

Wstaw następującą konfigurację wejścia i wyjścia w 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 }}

Przetestuj konfigurację Logstash za pomocą tego polecenia:

sudo service logstash configtest

powinien wyświetlić konfigurację OK, jeśli nie ma błędów składniowych. W przeciwnym razie spróbuj odczytać wynik błędu, aby zobaczyć, co jest nie tak z konfiguracją Logstash.

Uruchom ponownie Logstash i włącz go, aby wprowadzić zmiany konfiguracji w życie:

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

jeśli pobrałeś Logstash tar lub zip, możesz go uruchomić za pomocą następującego polecenia

bin/logstash -f logstash.conf

liczne odpowiedzi są odbierane. Struktura dokumentu jest następująca:

{ "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żliwia stronicowanie poprzez dodanie parametru size i from. Na przykład, jeśli chcesz pobrać wyniki w partiach po 5, zaczynając od 3 strony (np. Pokaż wyniki 11-15), zrobisz to:

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

jednak staje się to droższe, gdy idziemy dalej i dalej na listę wyników. Za każdym razem, gdy wykonujemy jedno z tych połączeń, ponownie uruchamiamy operację wyszukiwania, zmuszając Lucene do ponownej oceny wszystkich wyników, uszeregowania ich, a następnie odrzucenia pierwszych 10 (lub 10000, jeśli zajdziemy tak daleko). Łatwiejszą opcją jest API skanowanie i przewijanie. Chodzi o to, aby uruchomić rzeczywiste zapytanie raz, a następnie Elastic buforuje gdzieś wynik i daje nam “token dostępu”, aby wrócić i je uzyskać. Następnie wywołujemy punkt końcowy scroll API ze wspomnianym tokenem, aby uzyskać następną stronę wyników.

aby korzystać z przewijania, początkowe żądanie wyszukiwania powinno określać parametr przewijania w ciągu zapytania, który mówi Elasticsearch, jak długo powinno utrzymywać “Kontekst wyszukiwania” przy życiu, np. ?przewijanie=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" } }}'

wynik z powyższego żądania zawiera _scroll_id, który powinien zostać przekazany do API przewijania w celu pobrania następnej partii wyników.

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

parametr size pozwala na skonfigurowanie maksymalnej liczby trafień zwracanych przy każdej partii wyników. Każde wywołanie API przewijania zwraca następną partię wyników, dopóki nie zostanie już więcej wyników, tj. tablica trafień jest pusta. Kilka ważnych punktów do rozważenia w odniesieniu do Scroll and Scan API są następujące:

  • początkowe żądanie wyszukiwania i każde kolejne żądanie przewijania zwraca nowy _scroll_id, należy użyć tylko najnowszego identyfikatora _scroll_id.
  • jeśli żądanie określa agregacje, tylko początkowa odpowiedź wyszukiwania będzie zawierać wyniki agregacji.
  • żądania przewijania mają optymalizacje, które sprawiają, że są szybsze, gdy kolejność sortowania wynosi _doc. Jeśli chcesz iterować nad wszystkimi dokumentami bez względu na kolejność, jest to najbardziej efektywna opcja:
curl -XGET 'ES_HOST:ES_PORT/_search?scroll=1m&pretty' -H 'Content-Type: application/json' -d '{ "sort": }'

Kontekst wyszukiwania

parametr przewijania mówi Elasticsearch, jak długo powinien utrzymywać Kontekst wyszukiwania przy życiu. Jego wartość (np. 1m) nie musi być wystarczająco długa, aby przetworzyć wszystkie dane, musi tylko być wystarczająco długa, aby przetworzyć poprzednią partię wyników. Każde żądanie przewijania ustawia nowy czas wygaśnięcia.

Wyczyść interfejs API przewijania

Kontekst wyszukiwania są automatycznie usuwane po przekroczeniu limitu czasu przewijania. Jednak utrzymywanie zwojów otwartych wiąże się z kosztami (omówionymi w dalszej części sekcji wydajność), więc zwoje powinny być jawnie usuwane, gdy tylko zwoje nie są już używane przy użyciu interfejsu API clear-scroll:

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

wiele identyfikatorów przewijania może być przekazanych jako tablica:

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

wszystkie konteksty Wyszukiwania można wyczyścić za pomocą parametru _all:

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

Przewijanie w plasterkach

zapytania przewijania zwracające wiele dokumentów można podzielić na wiele plasterków, które można spożywać niezależnie:

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

wynik z pierwszego żądania zwraca dokumenty należące do pierwszego plasterka (id: 0), a wynik z drugiego żądania zwraca dokumenty należące do drugiego plasterka. Ponieważ maksymalna liczba plasterków jest ustawiona na 2, połączenie wyników dwóch żądań jest równoważne z wynikami zapytania przewijania bez plasterkowania.

domyślnie dzielenie odbywa się najpierw na odłamkach, a następnie lokalnie na każdym Odłamku przy użyciu pola _uid z następującą formułą:

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

uwagi dotyczące wydajności:

Scroll API : Proces scalania w tle optymalizuje indeks, łącząc ze sobą mniejsze segmenty w celu utworzenia nowych większych segmentów, po czym mniejsze segmenty są usuwane. Proces ten jest kontynuowany podczas przewijania, ale otwarty Kontekst wyszukiwania uniemożliwia usunięcie starych segmentów, gdy są one nadal używane. W ten sposób Elasticsearch może zwracać wyniki początkowego żądania wyszukiwania, niezależnie od późniejszych zmian w dokumentach.

utrzymanie starszych segmentów przy życiu oznacza, że potrzeba więcej uchwytów plików. Upewnij się, że węzły zostały skonfigurowane tak, aby miały dużo wolnych uchwytów plików, a kontekst API przewijania został wyczyszczony wkrótce po pobraniu danych.

możemy sprawdzić, ile kontekstów wyszukiwania jest otwartych za pomocą interfejsu nodes stats API:

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

dlatego bardzo konieczne jest wyczyszczenie kontekstu API przewijania, jak opisano wcześniej w sekcji Wyczyść API przewijania.

: Jeśli liczba plasterków jest większa niż liczba odłamków, filtr plasterków jest bardzo wolny przy pierwszych wywołaniach, ma złożoność O(N), a koszt pamięci jest równy N bitom na plasterek, gdzie n jest całkowitą liczbą dokumentów w Odłamku. Po kilku wywołaniach filtr powinien być buforowany, a kolejne wywołania powinny być szybsze, ale należy ograniczyć liczbę przyciętych zapytań, które wykonujesz równolegle, aby uniknąć eksplozji pamięci.

Uwaga: Maksymalna liczba plasterków dozwolona na przewijanie jest ograniczona do 1024 i może być aktualizowana za pomocą ustawienia indeksu index.max_slices_per_scroll, aby ominąć ten limit.

aby całkowicie uniknąć tego kosztu, można użyć doc_values innego pola do cięcia, ale użytkownik musi upewnić się, że pole ma następujące właściwości:

  • pole jest numeryczne.
  • doc_values są włączone w tym polu
  • każdy dokument powinien zawierać jedną wartość. Jeśli dokument ma wiele wartości dla określonego pola, używana jest pierwsza wartość.
  • wartość dla każdego dokumentu powinna być ustawiona raz, gdy dokument jest tworzony i nigdy nie jest aktualizowany. Zapewnia to, że każdy plasterek otrzymuje deterministyczne wyniki.
  • Dzięki temu każdy plasterek otrzymuje mniej więcej taką samą ilość dokumentów.

pole” date ” naturalnie służy powyższym właściwościom i dlatego może być użyte do krojenia:

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

Wypróbuj Qbox Hosted Elasticsearch

łatwo jest uruchomić standardowy hostowany klaster Elasticsearch w dowolnym z naszych 47 centrów danych Rackspace, Softlayer lub Amazon. Możesz teraz udostępniać własne kredyty AWS na Qbox Private Hosted Elasticsearch.

masz pytania? Napisz do nas wiadomość, a otrzymasz szybką odpowiedź.

nie korzystasz jeszcze z zalet hostowanego wyszukiwania dla firm ELK-stack na Qbox? Zapraszamy do założenia konta już dziś i odkrycia, jak łatwo jest zarządzać i skalować środowisko Elasticsearch w naszej usłudze hostingu w chmurze.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.