Spark流式处理 + Kafka 与仅使用Kafka的比较

13

为什么以及何时使用Spark流处理和Kafka?

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

我有两个选择:

  1. 创建自己的worker,从Kafka读取消息,运行分析算法并将结果存储在数据库中。在容器化时代,可以通过扩展命令轻松地将此worker扩展到整个群集,只需要确保我的工作程序的分区数等于或大于我的worker数量就可以实现真正的并发。

  2. 创建具有Kafka流输入的Spark集群。让Spark集群执行分析计算,然后存储结果。

有没有情况下第二个选项是更好的选择?听起来对我来说就像是额外的开销。


这要看情况。使用Spark Streaming,由于流式处理的构建方式,您可以通过分区数量并行化,而不必担心消费者组等问题,从而获得kafka消费者的可扩展性。手动读取时,您需要自己管理偏移量、工作节点之间的主题分布等。此外,使用DStream定义,您可以获得计算并行性,如果您的计算量很大,您需要自己处理。 - Yuval Itzchakov
1
相反,仅为处理少量流量而学习Spark等框架可能确实是一种负担。您现在真的需要所有的可扩展性吗?这将处理多少流量?会有数据高峰吗?这在用例方面存在很大差异,不是StackOverflow上可以回答的问题。 - Yuval Itzchakov
我每天获取数十个TB的数据,所以数量不小。如果我的分区比工作线程多,那么每个工作线程都会自动并发处理不同的分区。这一切都是由Kafka自动完成的。 - Sash
它们都在同一消费者组下从相同的主题中读取吗?您的消息是否通过某个键进行分区?我可以想到许多Spark免费提供的功能,但这不是评论讨论的内容。 - Yuval Itzchakov
1
你可以进一步分离#1,创建一个更简单的Kafka Streams应用程序,它消费Kafka消息,进行流式分析,并发布到一个输出主题,然后通过一个独立的Kafka Connector将结果存储到数据库中。 - Hans Jespersen
同一主题、同一消费者组,没有键。 - Sash
1个回答

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),因此您需要确定这是否是一个卖点。
对于实际的流式处理库,而不是Spark批处理,Apache Beam或Flink可能会让您执行相同类型的Kafka工作负载。
总的来说,要扩展生产者/消费者,您需要某种形式的资源调度程序。安装Spark对于某些人来说可能并不困难,但了解如何高效使用它并调整适当的资源可能是有难度的。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接