2016-07-19 14 views
7

Wir haben seit einiger Zeit Spark-Streaming mit Kafka verwendet und bis jetzt verwendeten wir die createStream-Methode von KafkaUtils.Spark-Streaming mit Kafka - createDirectStream vs createStream

Wir begannen gerade die createDirectStream zu erforschen und wie es aus zwei Gründen:

1) Bessere/einfacher "genau einmal" Semantik

2) Bessere Korrelation von kafka Thema Partition Partitionen RDD

Ich habe bemerkt, dass die createDirectStream als experimentell markiert ist. Die Frage, die ich habe, ist (tut mir leid, wenn dies nicht sehr spezifisch ist):

Sollten wir die createDirectStream Methode erkunden, wenn genau einmal sehr wichtig für uns ist? Wird toll sein, wenn ihr eure Erfahrungen damit teilen könnt. Gehen wir das Risiko ein, dass wir uns mit anderen Themen wie Zuverlässigkeit usw. befassen müssen?

Antwort

8

Es gibt einen großen, umfangreichen Blogbeitrag des Urhebers des direkten Ansatzes (Cody) here.

Im Allgemeinen die Kafka Lieferung Semantik Abschnitt lesen, der letzte Teil sagt:

So effektiv Kafka Garantien bei der kleinsten einmal Lieferung von Ausfall- und der Benutzer höchstens einmal Lieferung implementieren können durch das Deaktivieren Wiederholungen auf dem Hersteller und die Verrechnung vor der Verarbeitung eine Charge von Nachrichten. Genau-einmal-Lieferung erfordert Zusammenarbeit mit das Ziel-Storage-System, aber Kafka bietet den Offset, der macht die Umsetzung dieser geradlinig.

im Grunde bedeutet diese „wir Sie zumindest einmal aus der Box geben, wenn Sie genau einmal wollen, das ist auf Sie“. verstehen

Zweitens, dass Funke nicht garantiert genau einmal: Weiterhin sind die Blog-Post spricht über die Garantie für „genau einmal“ Semantik Sie Spark mit beiden Ansätzen erhalten (direkt und Empfänger basiert, Hervorhebung von mir) Semantik für Ausgabeaktionen. Wenn der Spark-Streaming-Guide über genau einmal spricht, bezieht es sich nur auf ein gegebenes Element in einem RDD , das einmal in einem berechneten Wert enthalten ist, in einem rein funktionalen Sinn. Alle seitenwirksamen Ausgabevorgänge (d. H. Alles, was Sie in foreachRDD tun, um das Ergebnis zu speichern) können wiederholt werden, da jede Stufe des Prozesses fehlschlagen und erneut versucht werden kann.

Auch ist es das, was die Spark-Dokumentation sagt über Empfänger basierte Verarbeitung:

Der erste Ansatz (Empfänger basiert) verwendet Kafkas hohe Level-API Offsets in Zookeeper verbraucht zu speichern. Dies ist traditionell der Weg, um Daten von Kafka zu konsumieren. Während dieser Ansatz (in Kombination mit Protokollen im Voraus schreiben) kann Null Datenverlust (d. H.mindestens einmal Semantik), gibt es eine kleine Chance einige Datensätze können zweimal unter einigen Fehlern konsumiert werden.

Diese im Grunde bedeutet, dass, wenn Sie den Empfänger mit Strom mit Funken verwenden können Sie immer noch Daten im Falle der Ausgabetransformation nicht dupliziert haben, ist es mindestens einmal.

In meinem Projekt verwende ich den direkten Stromansatz, bei dem die Lieferungssemantik von abhängt, wie Sie sie behandeln. Das bedeutet, dass Sie die Offsets zusammen mit den Daten in einer Transaktion wie Mode speichern können, wenn Sie eine andere Semantik sicherstellen möchten.

Ich empfehle die Blog-Post (Link oben) und die Delivery Semantics in the Kafka documentation page zu lesen. Abschließend empfehle ich definitiv, dass Sie sich den Direct-Stream-Ansatz ansehen.

Verwandte Themen