13

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

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

我有两个选择:

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

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

是否存在第二种选择更好的情况?在我看来,这只是额外的开销。

4

1 回答 1

2

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

如果您已经拥有可用的基础设施,那就太好了,使用它。将您的 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 对某些人来说可能并不难,但知道如何有效地使用它并调整适当的资源可能是

于 2018-05-13T22:47:37.133 回答