2015-02-18 34 views
12

Czy ktoś może mi powiedzieć, jaki jest algorytm ponownego równoważenia dla konsumentów Kafki? Chciałbym zrozumieć, jak wpływa na to liczba partycji i wątki konsumenckie.Algorytm Rebalancing Konsumentów Kafka

Dziękuję

+0

możliwe duplikat [Kafka Konsumentów rebilansowania] (http://stackoverflow.com/questions/27181693/kafka-consumer-rebalancing) –

+2

@ChrisForrence Dziękuję za wejście, jednak, że nie obejmuje algorytm w szczegół, którego szukałem, tak jak obecnie w Kafce 0.8 widzimy dziwne zachowanie i muszę zrozumieć algorytm, aby to odpowiednio uwzględnić. – NSA

+0

Powinieneś dodać te informacje do swojego pytania, a następnie;) [To] (http://stackoverflow.com/q/26757733/899126) jeden może pomóc trochę więcej –

Odpowiedz

23

Ok więc istnieją 2 algorytmy zrównoważenie tej chwili - Range i RoundRobin. Są one również nazywane strategiami przydzielania partycji.

Dla uproszczenia zakładamy, że mamy wątek T1 z 10 przegrodami i mamy także 2 konsumentom różnych konfiguracjach (na przykład być jaśniejsze) - C1 z num.streams zestaw do 1 i C2 z num.streams zestaw do 2.

Oto jak to będzie działać z Range strategii:

Zakres określa się dostępne partycje w porządku numerycznym i konsumentów wątków w leksykograficznego kolejności. W naszym przypadku kolejność partycji będzie wynosić 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a kolejność wątków konsumenckich będzie wynosiła C1-0, C2-0, C2-1. Następnie liczba partycji jest podzielona przez liczbę wątków konsumenckich, aby określić, ile partycji powinien posiadać każdy wątek konsumencki. W naszym przypadku nie dzieli on jednakowo, więc wątek C1-0 otrzyma jedną dodatkową partycję. Ostateczny przydział partycji będzie wyglądać następująco:

C1-0 dostaje partycje 0, 1, 2, 3
C2-0 dostaje partycje 4, 5, 6
C2-1 wystąpią partycje 7, 8, 9

Jeśli nie byłoby 11 partycji Przypisanie partycji dla tych konsumentów zmieniłbym trochę:

C1-0 otrzyma partycje 0, 1, 2, 3
C2-0 dostanie partycje 4, 5, 6, 7
C2-1 dostanie partycje 8, 9, 10

To wszystko.

Ta sama konfiguracja nie zadziałałaby dla strategii RoundRobin, ponieważ wymaga równego num.streams dla wszystkich konsumentów zasubskrybowanych w tym temacie, więc zakładamy, że obydwaj klienci mają obecnie num.streams ustawioną na 2. Jedną z głównych różnic w porównaniu do strategii Range jest to, że nie można przewidzieć, co będzie przypisane przed przywróceniem równowagi. Oto jak to będzie działać z RoundRobin strategii:

Po pierwsze, istnieją 2 warunki, które muszą być spełnione przed faktycznym Zadanie:

a) Każdy wątek ma taką samą liczbę strumieni wewnątrz instancji konsumentów (dlatego wspomniałem powyżej, że inna liczba wątków na jednego konsumenta nie będzie działać)
b) Zestaw subskrybowanych tematów jest identyczny dla każdej instancji konsumenta w grupie (mamy tu jeden temat, więc teraz nie stanowi to problemu).

Po zweryfikowaniu tych 2 warunków pary są sortowane według kodu skrótu w celu ograniczenia możliwości przypisania partycji z jednego tematu do jednego konsumenta (jeśli jest więcej niż jeden temat do spożycia).

I na koniec wszystkie pary są przypisywane w sposób okrągły do ​​dostępnych wątków konsumenckich. Na przykład, jeśli nasze tematycznych partycje zakończy się sortowane tak: T1-5, T1-3, T1-0, T1-8, T1-2, T1-1, T1-4, T1-7, T1-6, T1-9 i konsumentów wątki są C1-0, C1-1, C2-0, C2-1 następnie przypisanie będzie tak:

T1-5 idzie C1-0
T1-3 idzie C1-1
T1-0 idzie C2-0
T1-8 przechodzi do C2-1
W tym momencie nie ma już żadnych wątków konsumenckich, ale wciąż jest więcej partycji tematycznych, więc iteracja wątków konsumenckich zaczyna się od:
T1-2 idzie C1-0
T1-1 idzie C1-1
T1-4 idzie C2-0
T1-7 idzie C2-1
i znowu:
T1-6 idzie C1-0
T1-9 idzie C1-1

W tym momencie wszystko topic-partiti są przypisane i każdy wątek konsumenta ma prawie taką samą liczbę partycji.

Mam nadzieję, że to pomoże.

+0

Co stanie się, jeśli będzie więcej wątków konsumenckich niż partycji? – Kousha

+1

@Kousha następnie niektóre wątki konsumenckie będą bezczynne i nie otrzymają żadnej partycji. – serejja

+0

Wygląda na to, że round-robin sprawiłoby, że każdy konsument uzyskałby dane, ale niekoniecznie wszystkie wątki. – Kousha

0

mogliście przeczytać to Kafka docs http://kafka.apache.org/documentation/#impl_brokerregistration o algorytm rejestracji Konsumentów oraz równoważeniu Konsumentów algorytmu

Jak powiedział, każdy konsument wykonuje następujące czynności podczas równoważenia:

1. For each topic T that C<sub>i</sub> subscribes to 
2. let P<sub>T</sub> be all partitions producing topic T 
3. let C<sub>G</sub> be all consumers in the same group as C<sub>i</sub> that consume topic T 
4. sort P<sub>T</sub> (so partitions on the same broker are clustered together) 
5. sort C<sub>G</sub> 
6. let i be the index position of C<sub>i</sub> in C<sub>G</sub> and let N = size(P<sub>T</sub>)/size(C<sub>G</sub>) 
7. assign partitions from i*N to (i+1)*N - 1 to consumer C<sub>i</sub> 
8. remove current entries owned by C<sub>i</sub> from the partition owner registry 
9. add newly assigned partitions to the partition owner registry 
    (we may need to re-try this until the original partition owner releases its ownership) 

A także uwagę, że:

Jeśli jest więcej klientów niż partycji, niektórzy konsumenci nie otrzymają żadnych danych. Podczas równoważenia próbujemy przypisać partycje do klientów w taki sposób, aby zmniejszyć liczbę węzłów brokera, z którymi każdy konsument musi się połączyć.