2013-08-16 20 views
10

Próbuję udostępnić zadanie wśród wielu wylewek. Mam sytuacji, gdzie dostaję jeden krotki/wiadomości naraz ze źródła zewnętrznego i chcę mieć wiele wystąpień dziobek główną intencją jest dzielenie obciążenia i zwiększyć wydajność wydajność.Wiele wylewek Storm-Kafka, jak podzielić ładunek?

Mogę zrobić to samo z jednym wylewem, ale chcę podzielić obciążenie na wiele wylewek. Nie jestem w stanie uzyskać logiki do rozłożenia obciążenia. Ponieważ przesunięcie komunikatów nie będzie znane, dopóki konkretna dziobek nie zakończy spożywania części (tj. W oparciu o ustawiony rozmiar bufora).

Czy ktoś może podać jasne światło na temat tego, w jaki sposób ćwiczyć logikę/algorytm?

Advance Dzięki za rozmowę.


Aktualizacja w odpowiedzi do odpowiedzi:
obecnie używane multi-partycji na Kafki (tj 5)
Poniżej znajduje się kod używany:
builder.setSpout("spout", new KafkaSpout(cfg), 5);

Przetestowane przez powodzie z 800 MB danych na każdej partycji i to wykonano ~22 sec, aby zakończyć czytanie.

Znowu użył kodu z parallelism_hint = 1
tj builder.setSpout("spout", new KafkaSpout(cfg), 1);

Teraz zajęło więcej ~23 sec! Czemu?

Według Burza Docs setSpout (deklaracji) jest następujący:

public SpoutDeclarer setSpout(java.lang.String id, 
           IRichSpout spout, 
           java.lang.Number parallelism_hint) 

gdzie
parallelism_hint - jest liczbą zadań, które powinny być przypisane do wykonania tego dziobek. Każde zadanie zostanie uruchomione na wątku w procesie znajdującym się w pobliżu klastra.

Odpowiedz

17

Natknąłem się na dyskusję w storm-user, która omawia coś podobnego.

Przeczytaj Relationship between Spout parallelism and number of kafka partitions.


2 rzeczy zwrócić uwagę podczas korzystania z Kafki dziobek do burzy

  1. Maksymalna równoległość można mieć na KafkaSpout jest liczba partycji.
  2. Możemy podzielić ładunek na wiele tematów kafka i mieć osobnych instancji wylewki dla każdego. to znaczy. każda wylewka obsługuje osobny temat.

Jeśli mamy przypadek, w którym partycje kafka na hosta są skonfigurowane jako 1, a liczba hostów wynosi 2. Nawet jeśli ustawimy równoległość wylewki jako 10, wartość maksymalna, która zostanie powtórzona, będzie wynosić tylko 2 to liczba partycji.


Jak wymienić liczbę partycji w Kafka-wylewką?

List<HostPort> hosts = new ArrayList<HostPort>(); 
hosts.add(new HostPort("localhost",9092)); 
SpoutConfig objConfig=new SpoutConfig(new KafkaConfig.StaticHosts(hosts, 4), "spoutCaliber", "/kafkastorm", "discovery"); 

Jak widać, tutaj agenci mogą być dodawane za pomocą hosts.add a liczba partion jest określona jako we fragmencie kodu new KafkaConfig.StaticHosts(hosts, 4).


Jak wymienić wskazówkę równoległości w Kafka-wylewką?

builder.setSpout("spout", spout,4); 

można wymienić samo podczas dodawania dziobek do topologii używając setSpout metody. Tutaj jest podpowiedź równoległości.


Więcej linków, które mogą pomóc

Understanding-the-parallelism-of-a-Storm-topology

what-is-the-task-in-twitter-storm-parallelism


Oświadczenie: !! Jestem nowy zarówno dla burzy i java !!!! Tak więc pls edytować/dodać, jeśli jego wymagane niektóre gdzie.

+3

Ohhh ... jesteś bogiem wysłanym. Uratowałeś mi życie. Miałem 5 partycji kafka i ustawiłem parallelism_hint z 3 w setSpout() i zastanawiałem się dlaczego moja topologia czyta tylko z 3 kafka partycji po ustawieniu parallelism_hint na 5 rozwiązało mój problem. Dzięki za wskazanie tego. – Shams