【发布时间】:2017-12-28 23:55:30
【问题描述】:
为什么以及何时选择将 Spark 流与 Kafka 结合使用?
假设我有一个系统通过 Kafka 每秒接收数千条消息。我需要对这些消息应用一些实时分析并将结果存储在数据库中。
我有两个选择:
创建我自己的从 Kafka 读取消息的工作程序,运行分析算法并将结果存储在数据库中。在 Docker 时代,只需使用 scale 命令就可以轻松地在我的整个集群中扩展这个 worker。我只需要确保我的分区数量与我的工作人员相同或更多,并且一切都很好,并且我有真正的并发性。
使用 Kafka 流输入创建 Spark 集群。让 Spark 集群进行分析计算,然后存储结果。
在任何情况下第二个选项是更好的选择吗?在我看来,这只是额外的开销。
【问题讨论】:
-
视情况而定。使用 Spark Streaming,由于流的构建方式,您可以获得开箱即用的 kafka 消费者可扩展性,您可以根据您拥有的分区数量进行并行化,而不必担心消费者组等。手动读取时,您必须管理偏移量,自己在工作节点之间分配主题。此外,您可以通过使用
DStream的定义获得可计算性并行性,同样,如果您的计算“繁重”,您将需要自己完成。 -
相反,学习一个像 Spark 这样的框架来处理少量的流量肯定是一种开销。您真的需要现在的所有可扩展性吗?这将处理多少流量?会不会出现数据峰值?这因用例而异,在 StackOverflow 上无法回答。
-
我每天收到几十 TB,所以这不是一个小数目。如果我的分区比工人多,那么一切都会自动并发,因为每个工人分配到不同的分区。这一切都由 Kafka 自动完成。
-
他们是否都在同一个消费群下阅读相同的主题?您的消息是否被某个键分区?我可以在脑海中想出很多你可以使用 Spark 免费获得的东西,但这不是 cmets 中的讨论。
-
您可以进一步分离 #1,并拥有一个更简单的 Kafka Streams 应用程序,它可以使用 Kafka 消息、进行流式分析并发布到一个输出主题,然后该主题会转到一个单独的 Kafka 连接器来存储结果进入数据库。
标签: apache-spark apache-kafka spark-streaming spark-streaming-kafka