2016-09-07 45 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。