allegro.tech Data Science Meetup #2: Elasticsearch w praktyce

Post on 08-Jan-2017

793 views 1 download

Transcript of allegro.tech Data Science Meetup #2: Elasticsearch w praktyce

Elasticsearch w ekosystemie AllegroAndrzej Wisłowski, Paweł Bobruk

O nas:

zespół zajmujący się dostarczaniem zespołom

Elasticsearch jak usługę w Grupie Allegro

infrastruktura

konsultacje

szkolenia wewnętrzne

Agenda

Dlaczego elasticsearchTeoria wyszukiwania informacjiAgregacjePrzypadki użycia w AllegroInfrastruktura klastrów ELS w AllegroNowości w elasticsearch 2.0

Dlaczego elasticsearch

Real-Time data & analytics

System Rozproszony

Wyszukiwanie pełnotekstowe

Restowe API

Dokumenty JSONowe

Teoria wyszukiwania informacji

Wyszukiwanie informacji

Wyszukiwanie informacji (information retrivial) jest pozyskaniem istotnych dla szukającego informacji (zazwyczaj

dokumentów) z ze zbioru danych informatycznych (zazwyczaj

niestrukturalnych).

Odwrócony indeksDokument - element, na którym

budujemy system(np. produkt w sklepie, strona internetowa)

Term - element indeksu, zazwyczaj pojedyncze słowo zestaw termów tworzy słownik indeksu

Wyszukiwanie pełnotekstoweTerm Doc_1 Doc_2 Doc_3------------------------------------brown | X | X |dog | X | | dogs | | X | Xfox | X | | Xfoxes | | X |in | | X |jumped | X | | Xlazy | X | X |leap | | X |over | X | X | Xquick | X | X | Xsummer | | X |the | X | | X------------------------------------

Odwrócony index

Doc_1: The quick brown fox jumped over the lazy dogDoc_2: Quick brown foxes leap over lazy dogs in summerDoc_3: The quick fox jumped over dogs

Analizatory

Analizatory- Tokenizer

- whitespace - tokeny tylko po białych znakach

- standard - tokeny po białych znakach + znakach interpunkcji

- keyword - np. dla marek “Hugo Boss”

- regexp - własna definicja

- Token Filter

- lowercase

- stopword

- analiza języka polskiego

- stempel - stemer algorytmiczny

- hunspell for lucene - filtr oparty o słowniki i zasady gramatyki

- morfologik - analiza morfologiczna - polski projekt

Wyszukiwanie pełnotekstowe GET /my_index/_search

{ "query" : { "match" : { "body" : "brown" } }}

Term Doc_1 Doc_2 Doc_3------------------------------------brown | X | X | dog | X | | Xdogs | | X | Xfox | X | | Xfoxes | | X |in | | X |jumped | X | | Xlazy | X | X |leap | | X |over | X | X | Xquick | X | X | Xsummer | | X |the | X | | X------------------------------------

Odwrócony index

AgregacjeTerm Doc_1 Doc_2 Doc_3------------------------------------brown | X | X | dog | X | | Xdogs | | X | Xfox | X | | Xfoxes | | X |in | | X |jumped | X | | Xlazy | X | X |leap | | X |over | X | X | Xquick | X | X | Xsummer | | X |the | X | | X------------------------------------

Odwrócony index

GET /my_index/_search{ "query" : { "match" : { "body" : "brown" } }, "aggs" : { "popular_terms": { "terms" : { "field" : "body" } } }}

Field dataDoc Terms-----------------------------------------------------------------Doc_1 | brown, dog, fox, jumped, lazy, over, quick, theDoc_2 | brown, dogs, foxes, in, lazy, leap, over, quick, summerDoc_3 | dog, dogs, fox, jumped, over, quick, the-----------------------------------------------------------------

doc values - field data na dysku

Field dataDoc Terms-----------------------------------------------------------------Doc_1 | brown, dog, fox, jumped, lazy, over, quick, theDoc_2 | brown, dogs, foxes, in, lazy, leap, over, quick, summerDoc_3 | dog, dogs, fox, jumped, over, quick, the-----------------------------------------------------------------

GET /my_index/_search{ "query" : { "match" : { "body" : "brown" } }, "aggs" : { "popular_terms": { "terms" : { "field" : "body" } } }}

Term Doc_1 Doc_2 Doc_3------------------------------------brown | X | X | dog | X | | Xdogs | | X | X...-----------------------------------

{ "hits": { "total": 2, ... }, "aggregations": { "popular_terms": { "buckets": [ { "key": "brown", "doc_count": 2 }, { "key": "lazy", "doc_count": 2 }, { "key": "over", "doc_count": 2 }, { "key": "quick", "doc_count": 2 }, { "key": "dog", "doc_count": 1 }, ... ]}}}

Inverted index

Agregacje

Metricsminmaxsumavgvalue_countsum_of_squaresstd_deviationvariance

termsagregacja po polu

Najczęściej wyszukiwane słowa{

"aggs": { "mostCommonSearched": { "terms": { "field": "phrase" } } }}

{ "key": "samsung", "doc_count": 3321830 }, { "key": "galaxy", "doc_count": 2664985 }, { "key": "audi", "doc_count": 2343937 }, { "key": "nike", "doc_count": 2234019 }, ...

agregacjezagłębion

e

Najczęściej wyszukiwane per kategoria{ "aggs": {

"category": { "terms": { "field": "category", "size": 5 }, "aggs": { "mostCommonSearched": { "terms": { "field": "phrase", "size": 5 } } } } }}

Main Page Motoryzacja Książki i Komiksy Komputery Odzież, Obuwie, Dodatki

samsung audi testy lenovo nike

nike bmw historia tablet adidas

galaxy mercedes matematyka office buty

buty opel nauczyciela microsoft air

audi honda księga gtx sukienka

statscount, min, max, avg, sum

Statystyki cen per kategoria{ "aggs": {

"category": { "terms": { "field": "category", "size": 10 }, "aggs": { "stats": { "stats": { "field": "price" } } } }}

{ "key": "Oświetlenie/Lampy", "stats": { "count": 157452, "min": 1, "max": 66479, "avg": 297.42634631508975, "sum": 46830373.080003515 }},...

percentile

{ "key": "Oświetlenie/Lampy", "percentile": { "values": { "50.0": 162.65936064485723, "75.0": 330.90439138409306, "95.0": 980.0905118431161, "99.0": 2147.587473335171 } } }, ...

Ceny w percentylach per kategoria{

"aggs": {"category": {

"terms": { "field": "category.path",

"size": 10 }, "aggs": { "percentile": { "percentiles":

{ "field": "price", "percents": [ 50,

75,

95,

99 ] }

date_histogram

statystyka wg daty

Nowe produkty Sprzedawcy { "aggs": { "date": { "date_histogram": { "field": "createdAt", "interval": "month" } } }}

{

"key": “April”,

"doc_count": 13 }, {

"key": “May”,

"doc_count": 40 }, {

"key": “June”,

"doc_count": 28 }, ...

script

Koniec aukcji wg dni tygodnia{

"query": { "aggs": {

"auctionsPerWeekDay": { "terms": { "script": “doc['endDate'].date.dayOfWeek().getAsText()", } } }}

Niedziela 3672219

Sobota 3144495

Poniedziałek 3090514

Piątek 2823472

Środa 2729971

Czwartek 2724953

geo

Punkty odbioru w promieniu 1,5 km{

"aggs": { "byPlace": { "geo_distance": { "field": "location", "origin": "52.2401,21.0421", "ranges": [ { "to": 700}, {"from": 700, "to": 1000},

{"from": 1000, "to": 1500}

], "unit": "m" } } }}

{ "key": "*-700.0", "from": 0, "to": 700, "doc_count": 1 }, { "key": "700.0-1000.0", "from": 700, "to": 1000, "doc_count": 6 } , { "key": "1000.0-1500.0", "from": 1000, "to": 1500, "doc_count": 12 }

pipeline v 2.0

Pipeline

statystyczne (min, max, avg, ...)percentilecumulativemoving...

Moving

Elasticsearch w Allegro

Rekomendacje

Rekomendacje

- indeksowane są oferty allegro zawierające id meta produktu oraz ranking (score) oznaczający jakość oferty{ “name”: “iphone 6, super oferta” offerId: “23”, metaProductId: “p12”, score: 0,324}

- system rekomendacji wybiera meta produkty które mają być zarekomendowane użytkownikowi

Rekomendacje{ "aggregations": { "by_meta_product_id": { "buckets": [ { "key": "p12", "top_n_items": { "hits": { "total": 15, "max_score": null, "hits": [ { { "name": "iphone 6s" }, "sort": [ 0.1485 ] }, { { "name": "iphone 6s nowość", }, "sort": [ 0.1348 ] }, ... ]}}}]}}}

Problemy- optimize

- w Lucene zmiana dokumentu to usunięcie i dodanie nowego

- przy częstych zmianach indeksu, rośnie ilość skasowanych dokumentów, przy przekroczeniu pewnego progu - u nas 20% ma to wpływ na czasy odpowiedzi

- dlatego raz na dobę wymuszamy optimize indexu

Wydajność

- wielkość indeksu: 25 mln dokumentów

- odczyty > 3000 rps- czasy odpowiedzi : < 500ms (p99)Skalujemy odczyty przez większą liczbę replik.

http://hermes.allegro.tech/

https://github.com/allegro/hermes

Hermeswykorzystanie do audytów “eventów”, zapisywane

są wysłane i opublikowane “eventy”

wydajne zapisy ponad 4000 rps

indeksy timeseries (per dzień), łatowść kasowania

około 1,8 mld dokumentów

zapisy bulkami

DWH

- KIBANA - analityczne - biznes potrafi używać

- marketing / reklama

- 4 mld dokumentów

- 2000 indeksów

- indeksy timeseries z użyciem aliasów

Bilingi

Billingi serwisów allegro

około 400 mln dokumentów

indeksowań 100 rps

użycie timeseries i aliasów

routing po użytkowniku

Punkty odbioru - GEO

wyszukiwanie geolokalizacyjne

Setup klastrów

Setup cloudowy

prywatny cloud oparty na openstacku

ansible do automatyzacji stawiania klastrów (łatwe rozszerzanie)

backupy na hdfsa - rozszerzyliśmy o autoryzację kerberos

monitoring oparty na graphite, cabot i pagerduty

Narzędzie do reindeksacji

https://github.com/allegro/elasticsearch-reindex-tool

Nowości w elasticsearch 2.0

Elasticsearch 2.0

Agregacje Pipeline

uproszczone query API - (filtry zmergowane w query)

konfigurowalne kompresowanie (LZ4, DEFLATE)

doc-values - domyślne

Shield na poziomie pól i dokumentów (płatny)

Marvel opensoursed

Sense opensourced

Pytania