使用 Kafka 进行 Spark 流式传输 - createDirectStream 与 createStream
Posted
技术标签:
【中文标题】使用 Kafka 进行 Spark 流式传输 - createDirectStream 与 createStream【英文标题】:Spark streaming with Kafka - createDirectStream vs createStream 【发布时间】:2016-11-22 23:03:48 【问题描述】:一段时间以来,我们一直在使用带有 kafka 的 spark 流,直到现在我们使用来自 KafkaUtils
的 createStream
方法。
我们刚刚开始探索createDirectStream
并喜欢它有两个原因:
1) 更好/更简单的“恰好一次”语义
2) kafka 主题分区与 rdd 分区的更好关联
我确实注意到createDirectStream
被标记为实验性的。我的问题是(对不起,如果这不是很具体):
如果恰好一次对我们非常重要,我们是否应该探索createDirectStream
方法?如果你们能分享你的经验,那就太棒了。我们是否冒着不得不处理可靠性等其他问题的风险?
【问题讨论】:
【参考方案1】:直接方法的创建者 (Cody) here 有一篇很棒的博文。
总的来说,阅读Kafka交付语义部分,最后一部分说:
Kafka 在默认情况下有效地保证了至少一次交付,并且 允许用户通过禁用最多执行一次交付 重试生产者并在处理之前提交其偏移量 一批消息。一次性交付需要与 目标存储系统,但 Kafka 提供了偏移量 使实现这一点变得简单。
这基本上意味着“我们至少给你一次开箱即用,如果你只想要一次,那是你的”。此外,该博客文章还讨论了通过两种方法(直接和基于接收器,强调我的)从 Spark 获得的“恰好一次”语义的保证:
其次,了解 Spark 不保证完全一次 输出操作的语义。 当 Spark 流式传输指南谈话时 关于exactly-once,它只引用RDD中的给定项目 一次包含在计算值中,在纯函数中 感觉。任何有副作用的输出操作(即你在 foreachRDD 来保存结果)可能会重复,因为任何阶段 该过程可能会失败并被重试。
此外,Spark 文档中关于基于接收器的处理是这样说的:
第一种方法(基于接收器)使用 Kafka 的高级 API 来存储消费 Zookeeper 中的偏移量。这是传统上使用数据的方式 来自卡夫卡。 虽然这种方法(结合预写日志) 可以确保零数据丢失(即至少一次语义),有一个 在某些故障下,某些记录可能会被消耗两次。
这基本上意味着,如果您在 Spark 中使用基于 Receiver 的流,您可能仍有重复数据,以防输出转换失败,至少有一次。
在我的项目中,我使用直接流方法,其中交付语义取决于您如何处理它们。这意味着,如果您想确保只使用一次语义,您可以像 transaction 一样将偏移量与数据一起存储,如果一个失败,另一个也会失败。
我建议阅读博文(上面的链接)和Delivery Semantics in the Kafka documentation page。最后,我绝对建议您研究直接流方法。
【讨论】:
你提到的第一个博客链接已经打不开了。如果可能,请更新它。 @Sukumaar 我已更新链接以引用内容大致相同的演示文稿。以上是关于使用 Kafka 进行 Spark 流式传输 - createDirectStream 与 createStream的主要内容,如果未能解决你的问题,请参考以下文章