2016-09-07 88 views
4

我想輸出火花和火花流卡夫卡完全一次。但是,正如文檔所述, 「輸出操作(如foreachRDD)至少具有一次語義,也就是說,轉換後的數據可能在工作人員失敗的情況下不止一次地寫入外部實體。」
要執行事務性更新,spark建議使用批處理時間(在foreachRDD中可用)和RDD的分區索引來創建標識符。此標識符唯一標識流式傳輸應用程序中的blob數據。代碼如下:火花輸出到卡夫卡完全一次

dstream.foreachRDD { (rdd, time) => 
    rdd.foreachPartition { partitionIterator => 
    val partitionId = TaskContext.get.partitionId() 
    val **uniqueId** = generateUniqueId(time.milliseconds, partitionId) 
    // use this uniqueId to transactionally commit the data in partitionIterator 
    } 
} 

但如何使用UNIQUEID卡夫卡,使事務提交。

感謝

回答

0

的恰好一次與卡夫卡的解決方案,在由科迪Koeninger,在Kixer的高級軟件工程師火花峯會進行了討論。實質上,這個解決方案涉及用同時提交來存儲偏移量和數據。

工程師在2016年召開的Confluent聚會上向工程師提起一次精彩的主題時,引用了Cody關於此主題的講座。 Cloudera在http://blog.cloudera.com/blog/2015/03/exactly-once-spark-streaming-from-apache-kafka/發表了他的演講。科迪的論文在http://koeninger.github.io/kafka-exactly-once/#1和他的github(爲這個題目)在https://github.com/koeninger/kafka-exactly-once。還有他的講座的視頻可以在網上找到。

後續版本的Kafka介紹Kafka Streams來照顧沒有Spark的一次性場景,但該主題僅值得注意,因爲問題的框架是使用Spark。