2016-07-19 17 views
7

Od pewnego czasu używamy streamowania iskrowego z kafka i do tej pory używaliśmy metody createStream od KafkaUtils.Spark streaming z Kafka - createDirectStream vs createStream

Właśnie rozpoczął odkrywanie createDirectStream i jak to z dwóch powodów:

1) lepsze/łatwiejsze "tylko raz" semantyki

2) lepsze korelacji partycji tematu Kafka do RDD partycje

Zauważyłem, że createDirectStream jest oznaczony jako eksperymentalny. Mam pytanie (przepraszam, jeśli nie jest to zbyt szczegółowe):

Czy powinniśmy zbadać metodę createDirectStream, jeśli dokładnie jeden raz jest dla nas bardzo ważny? Będzie świetny, jeśli możesz podzielić się z nim swoim doświadczeniem. Czy ryzykujemy, że będziemy musieli poradzić sobie z innymi kwestiami, takimi jak niezawodność itp.?

Odpowiedz

8

Istnieje wielki, obszerny post na blogu autorstwa twórcy podejścia bezpośredniego (Cody) here.

W ogóle, czytając sekcję semantyka wysyłki Kafka, ostatnia część mówi:

Tak skutecznie gwarantuje Kafka przy-najmniej raz dostawy domyślnie pozwala użytkownikowi na wprowadzenie na najbardziej dostawy raz wyłączając ponawia próbę od producenta i zobowiązuje się do jego usunięcia przed przetworzeniem jednej partii wiadomości. Dokładnie raz dostawa wymaga współpracy z docelowym systemem pamięci masowej , ale Kafka zapewnia przesunięcie, które sprawia, że ​​realizacja jest prosta.

to w zasadzie oznacza „dajemy wam przynajmniej raz po wyjęciu z pudełka, jeśli chcesz dokładnie raz, to na was”. Ponadto, wpis na blogu opowiada o gwarancję „tylko raz” semantyka otrzymasz od Spark z obu podejść (bezpośrednie i odbiornik oparty podkreślenie moje):

drugie, rozumiem, że Spark nie gwarantuje dokładnie jednokrotnego semantyka dla działań wyjściowych. Gdy przewodnik dotyczący przesyłania strumieniowego Spark'a mówi o tym, co dokładnie raz, dotyczy tylko danego elementu w RDD , który jest uwzględniany w wyliczonej wartości tylko raz, w czysto funkcjonalnym sensie: . Każda operacja wyjściowa z efektem ubocznym (tj. Wszystko, co robisz w przypadku foreachRDD, aby zapisać wynik), może zostać powtórzone, ponieważ każdy etap może zakończyć się niepowodzeniem i zostać ponownie sprawdzony.

Ponadto, jest to, co mówi o Spark dokumentacji przetwarzania opartego odbiornika:

Pierwsze podejście (odbiornik oparty) wykorzystuje wysoki poziom API Kafki do przechowywania zużytego przesunięcia w Heca. Jest to tradycyjnie sposób konsumowania danych z Kafki. Podczas gdy to podejście (w połączeniu z dziennikami zapisu z wyprzedzeniem) może zapewnić zerową utratę danych (tj.przynajmniej raz na semantykę), jest mała szansa, że ​​niektóre rekordy mogą zostać zużyte dwukrotnie w przypadku pewnych błędów.

Oznacza, że ​​jeśli używasz strumień Odbiornik oparty na z Spark wciąż może być powielany danych w przypadku przekształcenia wyjście zawodzi, to przynajmniej raz.

W moim projekcie korzystam z metody bezpośredniego strumienia, w przypadku której semantyka dostawy zależy od , w jaki sposób należy je obsługiwać:. Oznacza to, że jeśli chcesz zapewnić dokładnie jeden raz semantykę, możesz przechowywać przesunięcia wraz z danymi w trybie , jeśli się nie uda, drugie również się nie powiedzie.

Polecam lekturę wpisu na blogu (powyższy link) i Delivery Semantics in the Kafka documentation page. Podsumowując, zdecydowanie polecam zapoznanie się z podejściem bezpośredniego strumienia.