2

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

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

4

2 回答 2

4

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

无需扩展您的 Kafka 集群即可扩展您的 Streams 应用程序。通常,Streams 应用程序的并行性受到应用程序输入主题的分区数量的限制。建议对您的主题进行过度分区(这样做的开销很小)以防止缩放限制。

因此,由于每个人都拥有自己的应用程序,因此“让任何人都可以构建应用程序”更加简单。无需将应用程序提交到集群。它们可以在您喜欢的任何地方执行(因此,每个团队都可以部署他们的 Streams 应用程序,就像他们部署他们拥有的任何其他应用程序一样)。因此,您有许多部署选项,从 WAR 文件,通过 YARN/Mesos,到容器(如 Kubernetes)。什么最适合你。

即使 Flink、Storm 或 Samza 等框架提供集群管理,您也只能使用与这些框架集成的工具(例如,Samza 需要 YARN——没有其他可用选项)。假设您已经有一个 Mesos 设置,您可以将它重用于您的 Kafka Streams 应用程序——不需要专用的“Kafka Streams 集群”(因为没有这样的东西)。

于 2017-01-25T07:00:59.693 回答
2

应用程序的处理器拓扑通过将其分解为多个任务来扩展。

更具体地说,Kafka Streams 根据应用程序的输入流分区创建固定数量的任务,每个任务分配一个来自输入流的分区列表(即 Kafka 主题)。

对任务的分区分配永远不会改变,因此每个任务都是应用程序的固定并行单元。然后,任务可以根据分配的分区实例化自己的处理器拓扑;它们还为每个分配的分区维护一个缓冲区,并一次处理来自这些记录缓冲区的消息。

因此,流任务可以独立并行处理,无需人工干预。

重要的是要了解 Kafka Streams 不是资源管理器,而是一个在其流处理应用程序运行的任何地方“运行”的库。应用程序的多个实例要么在同一台机器上执行,要么分布在多台机器上,并且任务可以由库自动分配给那些正在运行的应用程序实例。

分配给任务的分区永远不会改变;如果应用程序实例失败,它分配的所有任务将在其他实例上重新启动,并继续从相同的流分区消费。

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

我建议你看看这个指南,它可以帮助你更好地理解 Kafka Streams 的工作方式。

于 2017-01-25T10:39:06.423 回答