用于Spark流的kafka分区

bz4sfanl  于 2021-06-07  发布在  Kafka
关注(0)|答案(2)|浏览(718)

我正在使用Kafka与Spark流(2.2.0)。系统上的负载是动态的,我试图理解如何处理自动缩放。自动缩放有两个方面:
自动缩放计算基础设施
自动缩放应用程序组件以利用自动缩放的infra
红外线自动缩放:可以有各种定义良好的触发点缩放红外线。在我的例子中,其中一个可能的原因是处理到达Kafka的信息的延迟。因此,我可以监视kafka集群,如果消息处理延迟超过某个因素,那么我知道需要投入更多的计算能力。
应用程序自动缩放:在上面的场景中,假设我在kafka中长时间持有消息后,在spark集群中再添加一个nore。一个新的工人开始和主登记,从而Spark集群有更多的马力可用。有两种方法可以利用这种额外的马力。一种策略是通过添加更多分区来重新划分Kafka主题。一旦我这样做了,spark cluster将在下一批处理中并行拉取更多的消息,因此处理速度可能会提高。另一种策略可能不是重新划分kafka主题,而是向现有的执行器添加更多的核心,这样消息处理时间就会减少,从而可以同时从单个分区处理更多的消息。
我不确定上述策略是否正确,或者是否有其他方法来处理此类情况?

fcy6dtqo

fcy6dtqo1#

向现有的执行器添加更多的核心,这样消息处理时间就减少了,因此可以同时从单个分区处理更多的消息。
spark不是那样工作的。每个分区通常由一个线程处理。只有在某些任务排队等待执行者的情况下,添加更多内核可能会提高性能。
可能,因为cpu不是唯一重要的资源。如果瓶颈是网络的话,增加更多的核心是没有帮助的。
一种策略是通过添加更多分区来重新划分Kafka主题。一旦我这样做了,spark cluster将在下一批处理中并行拉取更多的消息,因此处理速度可能会提高。
如果spark cluster有足够的资源来处理额外的分区,这将很有帮助。否则,他们将只为他们的资源份额。
另外,如果不同时扩展kafka集群,单独添加分区可能不是一个解决方案。
最后你的评论:
现在在代码中,我可以重新划分这个rdd以加快处理速度。
除非处理量很大,否则重新分区的成本将超过仅仅处理数据的成本。
那么答案是什么呢?
如果资源不平衡,只扩展一个组件就可以实现恒定的吞吐量。
如果资源是平衡的,您可能需要扩展所有交互组件。
在此之前,请确保您正确识别了瓶颈。

bgibtngc

bgibtngc2#

即使您扩展了基础结构,并行使用者的数量也是主题中分区数量的顺序。因此,正确的方法是在需要时增加分区的数量。如果你觉得有必要扩大你的基础设施,你也可以这样做。

相关问题