2016-07-19 17 views
7

Bir süredir kafka ile kıvılcım akışı kullanıyorduk ve şu ana kadar KafkaUtils'dan createStream yöntemini kullanıyorduk. bölümleriKafka ile akıcılık akışı - createDirectStream vs createStream

RDD için

1) Daha iyi/daha kolay "yalnızca bir kez" semantik

2) kafka konu bölümünün daha iyi korelasyon:

Biz sadece iki nedenden dolayı createDirectStream ve bunun gibi keşfetmeye başladı createDirectStream'un deneysel olarak işaretlendiğini fark ettim. Sahip olduğum soru şu ki (eğer çok spesifik değilse):

Tam olarak bizim için çok önemli olan createDirectStream yöntemini araştırmalı mıyız? Deneyiminizi paylaşabiliyorsanız harika olacak. Güvenilirlik vb. Gibi diğer sorunlarla uğraşma riskini mi kullanıyoruz?

cevap

8

Doğrudan yaklaşımın yaratıcısı (Cody) here tarafından hazırlanan geniş ve kapsamlı bir blog yayını var. Genelde

Kafka teslim semantik bölümü okuduktan, son bölüm der ki:

varsayılan olarak teslimat ve verir Yani etkin bir Kafka garanti kerede-az kullanıcılı devre dışı bırakarak bir kere doğum en fazla uygulamaya , işlenmeden önce ofsetleri bir grup mesajla yeniden deniyor. Tam olarak bir kez teslimat, ile hedef depolama sistemi ile işbirliğini gerektirir, ancak Kafka, 'un bunu doğru bir şekilde gerçekleştirmesini sağladığı ofseti sağlar.

Bu temelde "tam olarak bir kez istiyorsak, kutunun dışında en az bir kez size verdikleri sana bağlı" demektir. Ayrıca, garanti hakkında blog yazısı görüşmeler "Tam olarak bir kez" semantik hem yaklaşımlar (doğrudan ve alıcı esaslı, vurgu benim) ile Kıvılcım aldığım:

İkinci, Kıvılcım tam-once garanti etmez anlamak Çıkış eylemleri için semantik. Spark akış kılavuzu, tam olarak bir kez hakkında konuştuğunda, yalnızca bir RDD belgesindeki belirli bir öğenin, yalnızca işlevsel bir anlamıyla, bir hesaplanan değere dahil edilmesiyle ilgili olduğunu belirtir. Herhangi bir yan etkili çıktı işlemi (yani, sonucu kaydetmek için foreachRDD'de yaptığınız herhangi bir şey) tekrar edilebilir, çünkü 'un herhangi bir aşaması işlemin başarısız olmasına ve yeniden denenmesine neden olabilir.

Ayrıca, bu Spark dokümantasyon alıcı bazlı işlem hakkında şöyle diyor:

Birinci yaklaşım (Alıcı bazlı) Zookeeper tüketilen uzaklıklar saklamak için Kafka'nın üst düzey API kullanır. Bu geleneksel olarak Kafka'dan veri tüketmenin yoludur. , bu yaklaşım (ilerideki yazma günlükleri ile birlikte) sıfır veri kaybını sağlayabilir (örn.en az bir kez semantik), bazı hatalar altında bazı kayıtlar iki kez tüketilebilir küçük bir şans var.

Bu temelde Spark ile Alıcı tabanlı akışı kullanıyorsanız yine çıkış dönüşümü başarısız olması durumunda veri çoğaltılmış olabilir anlamına gelir, bu en az bir kez olduğunu.

Projemde, teslim semantiklerinin belgesine bağlı olduğu doğrudan akış yaklaşımını kullanıyorum, bunlarla nasıl çalıştığınızı. Bu, tam olarak bir kez semantik olmasını sağlamak istiyorsanız, bir diğeri de başarısız olursa, ofsetleri işleminde olduğu gibi verilerle birlikte depolayabilirsiniz.

Blog gönderisini (yukarıdaki bağlantı) ve Delivery Semantics in the Kafka documentation page'u okumanızı öneririz. Sonuç olarak, doğrudan akış yaklaşımına bakmanızı kesinlikle tavsiye ederim.