跨多个用户扩展Kafka流应用程序

时间:2017-01-25 05:43:31

标签: apache-kafka apache-kafka-streams confluent

我有一个设置,我将事件推送到kafka,然后在同一个群集上运行Kafka Streams应用程序。可以公平地说,扩展Kafka Streams应用程序的唯一方法是通过添加节点或增加kafka来扩展Partitions群集本身吗?

在这种情况下,如何确保我的消费者不会关闭群集并确保关键管道始终为"on"。是否有Topology Priority的概念可以避免可能的停机时间?我希望能够为任何人公开流,以便在不影响核心管道的情况下构建应用程序。如果解决方案是设置另一个kafka群集,那么对于所有adhoc查询,使用Apache storm更有意义吗? (我知道很多消费者仍然会导致kafka群集出现问题,但至少topology处理现已被隔离了)

2 个答案:

答案 0 :(得分:3)

建议不要在与代理相同的服务器上运行Streams应用程序(即使这在技术上是可行的)。 Kafka的Streams API提供了一种基于应用程序的方法 - 而不是基于群集的方法 - 因为它是一个库,而不是一个框架。

不需要扩展Kafka群集来扩展Streams应用程序。通常,Streams应用程序的并行性受应用程序输入主题的分区数量限制。建议对主题进行过度分区(此开销相当小)以防止扩展限制。

因此,提供任何人构建应用程序甚至更简单。因为每个人都拥有他们的申请。无需向群集提交应用程序。它们可以在您喜欢的任何地方执行(因此,每个团队可以部署他们的Streams应用程序,就像部署他们拥有的任何其他应用程序一样)。因此,您有许多部署选项,从WAR文件,YARN / Mesos到容器(如Kubernetes)。什么都适合你。

即使像Flink,Storm或Samza这样的框架提供集群管理,您也只能使用与这些框架集成的工具(例如,Samza需要YARN - 没有其他选项可用)。假设您已经有了Mesos设置,您可以将它重用于您的Kafka Streams应用程序 - 无需专用的" Kafka Streams集群" (因为没有这样的事情)。

答案 1 :(得分:2)

  

应用程序的处理器拓扑通过将其分解来缩放   多项任务。

     

更具体地说,Kafka Streams基于创建固定数量的任务   在每个任务的应用程序的输入流分区上   从输入流中分配了一个分区列表(即Kafka   主题)。

     

分区到任务的分配永远不会改变,以便每个任务   是应用程序的并行性的固定单位。然后任务可以   根据分配的实例化自己的处理器拓扑   分区;他们还为每个指定的人保留一个缓冲区   从这些记录中一次一个地分区和处理消息   缓冲器。

     

因此,流任务可以独立处理   没有人工干预的并行。

     

了解Kafka Streams不是资源非常重要   经理,但是在其流处理的任何地方“运行”的库   应用程序运行执行应用程序的多个实例   无论是在同一台机器上,还是分布在多台机器上   任务可以由库自动分发给正在运行的人   应用程序实例。

     

分区到任务的分配永远不会改变;如果申请   实例失败,其他所有已分配的任务将重新启动   实例并继续使用相同的流分区。

流的处理发生在运行应用程序的机器上。

我建议您查看this guide,它可以帮助您更好地了解Kafka Streams的工作方式。