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:
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:
- Zaloguj się do swojego konta na Twitterze
- przejdź do https://dev.twitter.com/apps/
- Utwórz nową aplikację na Twitterze (tutaj podaję Twitter-Qbox-Stream jako nazwę aplikacji).
po pomyślnym utworzeniu aplikacji Twitter, otrzymasz następujące parametry w “klucze i tokeny dostępu”:
- klucz konsumenta (klucz API)
- Tajemnica konsumenta (Tajemnica API)
- Token dostępu
- sekret Tokena dostępu
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.