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.