Kafka Streaming Concurrency?

8

Ich habe einen grundlegenden Kafka-Streaming-Code, der Datensätze von einem Thema liest, etwas verarbeitet und Datensätze zu einem anderen Thema ausgibt.

Wie geht Kafka Streaming mit Nebenläufigkeit um? Läuft alles in einem einzigen Thread? Ich sehe das nicht in der Dokumentation erwähnt.

Wenn es single-threaded ist, möchte ich Optionen für Multi-Thread-Verarbeitung, um große Datenmengen zu behandeln.

Wenn es multi-threaded ist, muss ich verstehen, wie dies funktioniert und wie mit Ressourcen umzugehen ist, wie SQL-Datenbank-Verbindungen in verschiedenen Verarbeitungsthreads geteilt werden sollten.

Ist die integrierte Streaming-API von Kafka nicht für Szenarien mit hohem Volumen relativ zu anderen Optionen (Spark, Akka, Samza, Storm usw.) empfohlen?

    
clay 11.10.2016, 19:20
quelle

2 Antworten

14
  

Wie geht Kafka Streaming mit Nebenläufigkeit um? Läuft alles in einem einzigen Thread? Ich sehe das nicht in der Dokumentation erwähnt.

Dies ist ausführlich in Ссылка dokumentiert. Ich möchte das hier nicht wortwörtlich kopieren, aber ich möchte betonen, dass IMHO das Schlüsselelement zum Verständnis von Partitionen ist (vgl. Kafkas Thema Partitionen, auf das in Kafka Streams verallgemeinert wird) "Stream-Partitionen", da nicht alle Datenströme, die gerade verarbeitet werden, Kafka durchlaufen), weil eine Partition derzeit die Parallelität von Kafka (der Broker / Server-Seite) und von Stream-Processing-Anwendungen, die die Kafka Streams-API verwenden, bestimmt ( Client-Seite).

  

Wenn es single-threaded ist, möchte ich Optionen für Multi-Thread-Verarbeitung, um große Datenmengen zu behandeln.

Die Verarbeitung einer Partition wird immer nur von einem einzelnen "Thread" ausgeführt, wodurch sichergestellt wird, dass Sie keine Nebenläufigkeitsprobleme haben. Aber ...

  

Wenn es multi-threaded ist, muss ich verstehen, wie dies funktioniert und wie mit Ressourcen umzugehen ist, wie SQL-Datenbank-Verbindungen in verschiedenen Verarbeitungsthreads geteilt werden sollten.

... weil Kafka einem Thema erlaubt, viele Partitionen zu haben, bekommt man Parallelverarbeitung. Wenn ein Thema beispielsweise 100 Partitionen aufweist, können bis zu 100 Stream-Aufgaben (oder etwas zu vereinfacht: bis zu 100 verschiedene Computer, auf denen jeweils eine Instanz Ihrer Anwendung ausgeführt wird) dieses Thema parallel verarbeiten. Auch hier würde jeder Stream-Task exklusiven Zugriff auf 1 Partition erhalten, die er dann verarbeiten würde.

  

Ist die integrierte Streaming-API von Kafka nicht für Szenarien mit hohem Volumen relativ zu anderen Optionen (Spark, Akka, Samza, Storm usw.) empfohlen?

Kafkas Stream-Processing-Engine wird definitiv empfohlen und auch in der Praxis für Großserien-Szenarien eingesetzt. Arbeiten zum vergleichenden Benchmarking werden noch durchgeführt, aber in vielen Fällen erweist sich eine Anwendung, die auf Kafka Streams basiert, als schneller. Siehe LINE-Blog: Kafka-Streams für die interne Nachrichtenübermittlung anwenden für einen Artikel von LINE Corp, einem der die größten sozialen Plattformen in Asien (220 Millionen Nutzer), wo sie beschreiben, wie sie Kafka und die Kafka Stream API in der Produktion verwenden, um Millionen von Ereignissen pro Sekunde zu verarbeiten.

    
Michael G. Noll 12.10.2016, 07:04
quelle
4

Mit der Option kstreams config num.stream.threads können Sie die Anzahl der Threads von 1 überschreiben. Es ist jedoch möglicherweise vorzuziehen, einfach mehrere Instanzen Ihrer Streaming-App auszuführen, wobei alle ausgeführt werden die gleiche Verbrauchergruppe. Auf diese Weise können Sie so viele Instanzen hochfahren, wie Sie für eine optimale Partitionierung benötigen.

    
Nicholas 11.10.2016 21:14
quelle