使用 Kafka 进行 Spark 流式传输 - createDirectStream 与 createStream

Posted

技术标签:

【中文标题】使用 Kafka 进行 Spark 流式传输 - createDirectStream 与 createStream【英文标题】:Spark streaming with Kafka - createDirectStream vs createStream 【发布时间】:2016-11-22 23:03:48 【问题描述】:

一段时间以来,我们一直在使用带有 kafka 的 spark 流,直到现在我们使用来自 KafkaUtilscreateStream 方法。

我们刚刚开始探索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的主要内容,如果未能解决你的问题,请参考以下文章

流式传输 Kmeans Spark JAVA

使用 Spark 流式传输的 Redshift

Spark 流式传输作业在被驱动程序停止后失败

Spark 结构化流式传输 - 为不同的 GroupBy 键使用不同的 Windows

Spark流式传输作业不会删除随机播放文件

Postgres使用JDBC Kafka Connect进行流式传输