Spark Streaming + Kafka vs Just Kafka

Posted

技术标签:

【中文标题】Spark Streaming + Kafka vs Just Kafka【英文标题】:Spark streaming + Kafka vs Just Kafka 【发布时间】:2017-12-28 23:55:30 【问题描述】:

为什么以及何时选择将 Spark 流与 Kafka 结合使用?

假设我有一个系统通过 Kafka 每秒接收数千条消息。我需要对这些消息应用一些实时分析并将结果存储在数据库中。

我有两个选择:

    创建我自己的从 Kafka 读取消息的工作程序,运行分析算法并将结果存储在数据库中。在 Docker 时代,只需使用 scale 命令就可以轻松地在我的整个集群中扩展这个 worker。我只需要确保我的分区数量与我的工作人员相同或更多,并且一切都很好,并且我有真正的并发性。

    使用 Kafka 流输入创建 Spark 集群。让 Spark 集群进行分析计算,然后存储结果。

在任何情况下第二个选项是更好的选择吗?在我看来,这只是额外的开销。

【问题讨论】:

视情况而定。使用 Spark Streaming,由于流的构建方式,您可以获得开箱即用的 kafka 消费者可扩展性,您可以根据您拥有的分区数量进行并行化,而不必担心消费者组等。手动读取时,您必须管理偏移量,自己在工作节点之间分配主题。此外,您可以通过使用DStream 的定义获得可计算性并行性,同样,如果您的计算“繁重”,您将需要自己完成。 相反,学习一个像 Spark 这样的框架来处理少量的流量肯定是一种开销。您真的需要现在的所有可扩展性吗?这将处理多少流量?会不会出现数据峰值?这因用例而异,在 *** 上无法回答。 我每天收到几十 TB,所以这不是一个小数目。如果我的分区比工人多,那么一切都会自动并发,因为每个工人分配到不同的分区。这一切都由 Kafka 自动完成。 他们是否都在同一个消费群下阅读相同的主题?您的消息是否被某个键分区?我可以在脑海中想出很多你可以使用 Spark 免费获得的东西,但这不是 cmets 中的讨论。 您可以进一步分离 #1,并拥有一个更简单的 Kafka Streams 应用程序,它可以使用 Kafka 消息、进行流式分析并发布到一个输出主题,然后该主题会转到一个单独的 Kafka 连接器来存储结果进入数据库。 【参考方案1】:

在 Docker 时代,很容易在我的整个集群中扩展这个工作器

如果您已经拥有该基础架构,那就太好了,请使用它。将您的 Kafka 库捆绑在一些带有健康检查的最小容器中,而在大多数情况下,它可以正常工作。添加 Kafka 客户端依赖项 + 数据库依赖项是您真正需要的,对吗?

如果您不使用 Spark、Flink 等,您将需要更接近您的代码来处理 Kafka 错误、重试、偏移和提交处理,而不是让框架为您处理这些。

我会在这里补充一点,如果您想要 Kafka + 数据库交互,请查看 Kafka Connect API。已经有 JDBC、Mongo、Couchbase、Cassandra 等现有的解决方案。

如果您需要更完整的处理能力,我会选择 Kafka Streams,而不是需要单独维护 Spark 集群,这就是“只是 Kafka”

创建 Spark 集群

假设您不想维护它,或者您无法在 YARN、Mesos、Kubernetes 或 Standalone 之间进行选择。如果您正在运行前三个,那么无论如何都应该考虑在这些上运行 Docker。

你说得对,它是额外的开销,所以我发现这完全取决于你有什么可用的(例如,具有空闲内存资源的现有 Hadoop/YARN 集群),或者你愿意在内部支持什么(或为供应商服务付费,例如某些托管解决方案中的 Kafka 和 Databricks)。

另外,Spark 没有运行最新的 Kafka 客户端库(我相信直到 2.4.0 更新到 Kafka 2.0),所以您需要确定这是否是一个卖点。

对于实际的流式库,而不是 Spark 批处理,Apache Beam 或 Flink 可能会让您针对 Kafka 执行相同类型的工作负载


一般来说,为了扩展生产者/消费者,您需要某种形式的资源调度器。对某些人来说,安装 Spark 可能并不难,但知道如何有效地使用它并调整适当的资源可能是

【讨论】:

Spark 提供 Windowing 功能,例如与 HyperLogLog 结合使用时,可以进行近似的状态管理,而无需将所有数据存储在外部系统中并循环查询。 卡夫卡不是“外部系统”吗? Spark 通常都在内存中。换句话说,我不确定弹性如何/在哪里持续 我只是想说 Spark 提供了开箱即用的基于 docker 的解决方案无法实现的窗口功能。 为什么 Docker 会影响窗口化?如果它只是在远程机器上启动一个驱动程序,那么 Docker 就不是问题了。我觉得这个问题更多的是只询问 Kafka Brokers,并添加任何处理层,这恰好是 Dockerized ......归根结底,它仍然是一个运行代码的 JVM

以上是关于Spark Streaming + Kafka vs Just Kafka的主要内容,如果未能解决你的问题,请参考以下文章

spark streaming kafka example

Spark Streaming实时流处理项目实战Spark Streaming整合Kafka实战一

Spark Streaming实时流处理项目实战Spark Streaming整合Kafka实战一

Spark Streaming实时流处理项目实战Spark Streaming整合Kafka实战一

Kafka:ZK+Kafka+Spark Streaming集群环境搭建(二十二)Spark Streaming接收流数据及使用窗口函数

Spark Streaming:Spark Structured Streaming 中不允许使用 Kafka 组 ID