Modelowanie danych z Kafką? Tematy i partycje

Jedną z pierwszych rzeczy, o których myślę podczas korzystania z nowej usługi (takiej jak przechowalnia danych innych niż RDBMS lub Kolejka komunikatów) jest: "jak mam uporządkować swoje dane?".

Przeczytałem i obejrzałem kilka materiałów wprowadzających. W szczególności, Weźmy na przykład Kafka: rozproszony system Wiadomości do przetwarzania logów , który pisze:
  • "Temat jest kontenerem, z którym wiadomości są powiązane"
  • "najmniejszą jednostką równoległości jest podział tematu. Oznacza to, że wszystkie wiadomości, które ... należy do określonej partycji tematu zostanie zużyty przez konsumenta w grupie konsumenckiej."

Wiedząc o tym, jaki byłby dobry przykład, który ilustruje, jak korzystać z tematów i partycji? Kiedy coś powinno być tematem? Kiedy coś powinno być partycją?

Jako przykład, powiedzmy, że moje (Clojure) dane wyglądają następująco:

{:user-id 101 :viewed "/page1.html" :at #inst "2013-04-12T23:20:50.22Z"}
{:user-id 102 :viewed "/page2.html" :at #inst "2013-04-12T23:20:55.50Z"}

Czy temat powinien być oparty na user-id? viewed? at? A co z przegrodą?

Jak Ja decyduję?

 142
Author: David J., 2013-06-20

4 answers

Podczas strukturyzacji danych dla Kafki naprawdę zależy od tego, jak mają być zużyte.

Według mnie temat jest grupowaniem wiadomości podobnego typu, które będą konsumowane przez tego samego typu konsumenta, więc w powyższym przykładzie miałbym tylko jeden temat i jeśli zdecydujesz się przepchnąć jakieś inne dane przez Kafkę, możesz dodać do tego nowy temat później.

Tematy są zarejestrowane w ZooKeeper, co oznacza, że możesz napotkać problemy, jeśli próbujesz dodać wiele z nich, np. przypadek, w którym masz milion użytkowników i zdecydowałeś się utworzyć temat na użytkownika.

Partycje z drugiej strony jest sposobem na równoległe zużycie wiadomości i całkowita liczba partycji w klastrze brokera musi być co najmniej taka sama jak liczba konsumentów w grupie konsumentów, aby zrozumieć funkcję partycjonowania. Konsumenci w grupie konsumentów podzielą ciężar przetwarzania tematu między siebie zgodnie z podziałem tak, że jeden konsument będzie zajmował się tylko wiadomościami w samej partycji jest "przypisany do".

Partycjonowanie może być jawnie ustawione za pomocą klucza partycji po stronie producenta lub jeśli nie zostanie to przewidziane, dla każdej wiadomości zostanie wybrana losowa partycja.

 118
Author: Lundahl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-20 13:57:03

Gdy już wiesz, jak podzielić strumień zdarzeń, nazwa tematu będzie łatwa, więc najpierw odpowiedzmy na to pytanie.

@ Ludd ma rację - wybrana struktura partycji zależy w dużej mierze od tego, jak chcesz przetworzyć strumień zdarzeń. Najlepiej, jeśli potrzebujesz klucza partycji, co oznacza, że Twoje przetwarzanie zdarzeń to partition-local.

Na przykład:

  1. jeśli zależy ci na średnim czasie użytkowników na stronie, powinieneś podzielić według :user-id. W ten sposób, wszystkie zdarzenia związane z aktywnością witryny jednego użytkownika będą dostępne na tej samej partycji. Oznacza to, że silnik przetwarzania strumieniowego, taki jak Apache Samza , może obliczyć średni czas na miejscu dla danego użytkownika po prostu patrząc na zdarzenia w jednej partycji. Pozwala to uniknąć konieczności wykonywania wszelkiego rodzaju kosztownego przetwarzania partycji-global
  2. jeśli zależy ci na najpopularniejszych stronach w Twojej witrynie, powinieneś podzielić na strony :viewed. Znowu Samza będzie w ten sposób możliwe jest wyświetlenie wszystkich stron na jednej partycji.]}

Ogólnie rzecz biorąc, staramy się unikać polegania na stanie globalnym (takim jak przechowywanie danych w zdalnej bazie danych, takiej jak DynamoDB lub Cassandra), a zamiast tego BYĆ w stanie pracować przy użyciu stanu lokalnego partycji. Dzieje się tak, ponieważ lokalny stan jest podstawowym prymitywem w przetwarzaniu strumienia.

Jeśli potrzebujesz obu powyższych przypadków użycia, to wspólny wzór z Kafką jest pierwszy partycja przez say :user-id, a następnie do ponowna partycja przez :viewed gotowa do następnej fazy przetwarzania.

W temacie nazwy-oczywistym tutaj byłoby events lub user-events. Aby być bardziej szczegółowym, możesz użyć events-by-user-id i / lub events-by-viewed.

 46
Author: Alex Dean,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-24 17:11:39

Myślę, że nazwa tematu jest konkluzją pewnego rodzaju wiadomości, a producent publikuje wiadomość do tematu, a konsument subskrybuje wiadomość poprzez Subskrybuj temat.

Temat może mieć wiele partycji. partycja jest dobra dla równoległości. partycja jest również jednostką replikacji, więc w Kafka, lider i follower jest również powiedziane na poziomie partycji. W rzeczywistości partycja jest kolejką uporządkowaną, której kolejność jest kolejką wiadomości. A temat składa się z jednej lub kilku kolejek w proste słowo. Jest to dla nas przydatne do modelowania naszej struktury.

Kafka jest rozwijana przez LinkedIn do agregacji i dostarczania logów. ta scena jest bardzo dobra jako przykład.

Zdarzenia użytkownika w sieci lub aplikacji mogą być rejestrowane przez web sever, a następnie wysyłane do brokera Kafka za pośrednictwem producenta. W producer można określić metodę partycji, na przykład: typ zdarzenia (różne zdarzenia są zapisywane na innej partycji) lub czas zdarzenia (partycja dzień w innym okresie według twoja logika aplikacji) lub typ użytkownika lub po prostu brak logiki i zrównoważenie wszystkich logów na wiele partycji.

Jeśli chodzi o Twój przypadek, możesz utworzyć jeden temat o nazwie "page-view-event" i utworzyć N partycji za pomocą kluczy hashowych, aby równomiernie rozłożyć dzienniki na wszystkie partycje. Albo możesz wybrać logikę partycji, aby dziennik był rozprowadzany przez twojego ducha.

 3
Author: GuangshengZuo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-21 03:34:45

Nie jest to dokładnie związane z pytaniem, ale jeśli już zdecydowałeś się na logiczną segregację rekordów na podstawie tematów i chcesz zoptymalizować liczbę tematów / partycji w Kafce, Ten blog może się przydać.

Najważniejsze informacje w skrócie:

  • Ogólnie rzecz biorąc, im więcej partycji jest w klastrze Kafka, tym wyższa przepustowość można osiągnąć. Niech max osiągalny na jednej partycji do produkcji będzie p i konsumpcja być c. Powiedzmy, że docelowa przepustowość wynosi t. Wtedy musisz mieć co najmniej max(t/p, t/c) partycje.

  • Obecnie w Kafce każdy broker otwiera plik zarówno indeksu, jak i Pliku danych każdego segmentu dziennika. Im więcej partycji, tym wyżej trzeba skonfigurować otwarty plik obsługa limitu w podstawowym systemie operacyjnym. Np. w naszym systemie produkcyjnym, kiedyś zauważyliśmy błąd mówiący too many files are open, podczas gdy mieliśmy około 3600 partycji tematycznych.

  • Gdy broker jest wyłączony (np. kill -9), obserwowana niedostępność może być proporcjonalna do liczby partycji.

  • Termin "end-to-end latency" w Kafce jest definiowany przez czas, od kiedy wiadomość jest publikowana przez producenta do kiedy wiadomość jest czytana przez konsumenta. Z reguły thumb, jeśli zależy ci na opóźnieniu, prawdopodobnie dobrym pomysłem jest ograniczenie liczby partycji na brokera do 100 x b x r, gdzie b to liczba brokerów w klastrze Kafka, a r to współczynnik replikacji.

 1
Author: Bitswazsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-05 08:07:20