Spark流媒体+ Kafka vs Just Kafka

Sas*_*ash 13 apache-kafka apache-spark spark-streaming spark-streaming-kafka

为什么以及何时会选择使用Kafka的Spark流媒体?

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

我有两个选择:

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

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

有没有第二种选择是更好的选择?听起来像是一个额外的开销.

cri*_*007 2

在 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),因此您需要确定这是否是一个卖点。

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


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