我可以在Kafka Broker的同一台机器上运行Kafka Streams应用程序吗?

时间:2017-09-12 12:26:05

标签: apache-kafka kafka-consumer-api kafka-producer-api apache-kafka-streams

我有一个Kafka Streams应用程序,它从少数主题中获取数据并加入数据并将其放入另一个主题。

Kafka配置:

5 kafka brokers
Kafka Topics - 15 partitions and 3 replication factor. 

注意:我在运行Kafka Brokers的机器上运行Kafka Streams应用程序。

每小时消耗/生产的记录数量达数百万。每当我关闭任何一个kafka经纪人时,它都会进入重新平衡状态并且大约需要。重新平衡需要30分钟甚至更长时间,很多时候它会杀死许多Kafka Streams流程。

2 个答案:

答案 0 :(得分:0)

技术上可以在与代理相同的服务器上运行Kafka Streams应用程序。 但不建议这样做。两者都需要共享相同的资源,最终会产生争用。

  

每当我关闭任何kafka经纪人时,它都会进入重新平衡

不确定为什么会这样。您使用的是什么版本的Kafka或Streams API?如果您在经纪人0.10.1+上,我强烈建议您将Streams应用程序升级到0.11(注意,您可以在没有经纪人升级的情况下执行此操作)。

根据您要分阶段处理的问题的详细信息,StandbyTask 可能会帮助解决长期重新平衡问题。您可以简单地配置参数num.standby.replica = 1以启用StandbyTask s。

答案 1 :(得分:0)

回答标题中的问题:

来自Spark / HDFS背景,我认为这是一种思维方式的改变,因为您习惯于认为将数据处理放在哪里,以利用数据局部性。在这里,代理将提供数据位置,但必须将数据发送到Kafka Streams集群进行处理(失去一些好处)。但是,将它们分开可以让您分别管理两个集群。

如果您想到一个运行高延迟处理作业的群集,它共享数据+处理(例如HDFS + YARN群集),您可以获得“数据处理过程”,而不是相反。您可以为数据处理分配资源 - 但想法是您的处理不依赖于临时数据峰值(与Streaming一样),而是依赖于总数据量。如果您的数据增长,您的计算将花费更多,并且您可以分配更多资源,但它们会同时增长。但是,在流应用程序中,必要的处理能力确实取决于数据峰值(以及您的低延迟要求)而不是总数据量,因此存储和处理的尺寸和管理是分开的,因为它们的弹性要求不是基于相同的维度。

这与显而易见的事实不同,即同时拥有数据处理 - Kafka代理和数据处理 - 同一节点中的Kafka Streams会为节点带来更多负载,但我们在此假设这一点在确定您的尺寸时已经考虑到了节点