2015-06-04 13 views
5

Ist es möglich, in Spark Streaming die In-Order-Verarbeitung zu erzwingen? Unser Anwendungsfall ist das Lesen von Ereignissen aus Kafka, wo jedes Thema in der richtigen Reihenfolge bearbeitet werden muss.In-Order-Verarbeitung in Spark Streaming

Von dem, was ich sagen kann, ist es unmöglich - jeder Strom in RDDs und RDDS verarbeitet werden parallel verarbeitet, so gibt es keine Möglichkeit, die Reihenfolge zu garantieren.

Antwort

1

Sie könnten die RDD zwingen, eine einzelne Partition zu sein, die jede Parallelität entfernt.

+0

Aber der DStream ist in RDDs aufgeteilt - ist es nicht möglich, dass die 2. RDD die Verarbeitung vor dem ersten beendet? – EugeneMi

+0

Gemäß der Dokumentation "Standardmäßig werden Ausgabevorgänge einzeln ausgeführt. Sie werden in der Reihenfolge ausgeführt, in der sie in der Anwendung definiert sind." – Holden

1

„Unser Anwendungsfall Ereignisse von Kafka lesen, wo jedes Thema, um verarbeitet zu werden braucht.“

Wie pro meinem Verständnis, jedes Thema Formen separata Dstreams. Du solltest also jeden Dstream nacheinander bearbeiten.

Aber am wahrscheinlichsten meinst du, du möchtest jedes Ereignis bearbeiten, das du von 1 Kafka-Thema bekommst. In diesem Fall sollten Sie nicht auf die Reihenfolge der Datensätze in einer RDD angewiesen sein, sondern Sie sollten jeden Datensatz mit dem Zeitstempel versehen, wenn Sie ihn zum ersten Mal sehen (wahrscheinlich weit stromaufwärts) und diesen Zeitstempel verwenden, um später zu bestellen.

Sie haben andere Möglichkeiten, die schlecht sind :)

  1. Als Holden schon vermuten lassen, setzt alles in einer Partition
  2. Partition mit etwas steigenden Funktion basierend auf der Zeit empfängt, so dass Sie Partitionen füllen nacheinander . Dann können Sie zipWithIndex zuverlässig verwenden.