如何决定kafka集群中话题的分区的数量

如题所述

第1个回答  2016-08-02
如何决定kafka集群中topic,partition的数量,这是许多kafka用户经常遇到的问题。本文列举阐述几个重要的决定因素,以提供一些参考。
分区多吞吐量更高

一个话题topic的各个分区partiton之间是并行的。在producer和broker方面,写不同的分区是完全并行的。因此一些昂贵的操作比如压缩,可以获得更多的资源,因为有多个进程。在consumer方面,一个分区的数据可以由一个consumer线程在拉去数据。分区多,并行的consumer(同一个消费组)也可以多。因此通常,分区越多吞吐量越高。
基于吞吐量可以获得一个粗略的计算公式。先测量得到在只有一个分区的情况下,Producer的吞吐量(P)和Consumer的吞吐量(C)。那如果总的目标吞吐量是T的话,max(T/P,T/C)就是需要的最小分区数。在单分区的情况下,Producer的吞吐量可以通过一些配置参数,比如bath的大小、副本的数量、压缩格式、ack类型来测得。而Consumer的吞吐量通常取决于应用程序处理每一天消息逻辑。这些都是需要切合实际测量。
随着时间推移数据量的增长可能会需要增加分区。有一点需要注意的是,Producer者发布消息通过key取哈希后映射分发到一个指定的分区,当分区数发生变化后,会带来key和分区映射关系发生变化。可能某些应用程序依赖key和分区映射关系,映射关系变化了,程序就需要做相应的调整。为了避免这种key和分区关系带来的应用程序修改。所以在分区的时候尽量提前考虑,未来一年或两年的对分区数据量的要求。
除了吞吐量,还有一些其他的因素,在定分区的数目时是值得考虑的。在某些情况下,太多的分区也可能会产生负面影响。

分区多需要的打开的文件句柄也多

每个分区都映射到broker上的一个目录,每个log片段都会有两个文件(一个是索引文件,另一个是实际的数据文件)。分区越多所需要的文件句柄也就越多,可以通过配置操作系统的参数增加打开文件句柄数。

分区多增加了不可用风险

kafka支持主备复制,具备更高的可用性和持久性。一个分区(partition)可以有多个副本,这些副本保存在不同的broker上。每个分区的副本中都会有一个作为Leader。当一个broker失败时,Leader在这台broker上的分区都会变得不可用,kafka会自动移除Leader,再其他副本中选一个作为新的Leader。Producer和Consumer都只会与Leader相连。
一般情况下,当一个broker被正常关机时,controller主动地将Leader从正在关机的broker上移除。移动一个Leader只需要几毫秒。然当broker出现异常导致关机时,不可用会与分区数成正比。假设一个boker上有2000个分区,每个分区有2个副本,那这样一个boker大约有1000个Leader,当boker异常宕机,会同时有1000个分区变得不可用。假设恢复一个分区需要5ms,1000个分区就要5s。
分区越多,在broker异常宕机的情况,恢复所需时间会越长,不可用风险会增加。

分区多会增加点到点的延迟

这个延迟需要体现在两个boker间主备数据同步。在默认情况下,两个boker只有一个线程负责数据的复制。

根据经验,每个boker上的分区限制在100*b*r内(b指集群内boker的数量,r指副本数量)。
分区多会增加客户端的内存消耗

kafka0.8.2后有个比较好的特色,新的Producer可以允许用户设置一个缓冲区,缓存一定量的数据。当缓冲区数据到达设定量或者到时间,数据会从缓存区删除发往broker。如果分区很多,每个分区都缓存一定量的数据量在缓冲区,很可能会占用大量的内存,甚至超过系统内存。
Consumer也存在同样的问题,会从每个分区拉一批数据回来,分区越多,所需内存也就越大。
根据经验,应该给每个分区分配至少几十KB的内存。
总结

在通常情况下,增加分区可以提供kafka集群的吞吐量。然而,也应该意识到集群的总分区数或是单台服务器上的分区数过多,会增加不可用及延迟的风险。本回答被提问者采纳

kafka的partition数量这样来定
确定kafka分区数量并非易事,它取决于业务需求、集群规模和系统默认设置。首要目标是决定数据处理的并发度,确保高效处理。kafka采用去中心化的架构,每个partition由leader和follower组成,保证数据的分布和处理并行性。业务特性影响分区数量的选择。例如,用户登录数据若按省份分组统计,应设置与省份数量一致的分...

如何为一个kafka集群选择topics\/partitions的数量
根据经验,每个boker上的分区限制在100*b*r内(b指集群内boker的数量,r指副本数量)。分区多会增加客户端的内存消耗 kafka0.8.2后有个比较好的特色,新的Producer可以允许用户设置一个缓冲区,缓存一定量的数据。当缓冲区数据到达设定量或者到时间,数据会从缓存区删除发往broker。如果分区很多,每个...

kafka的partition数量这样来定
partition的数量是静态的,它决定了数据的源头分发,而并行度则是动态的,取决于计算需求。理想的并行度应小于等于分区数,避免资源浪费。在设置并行度时,最好将其整除分区数以最大化利用。并行度的确定不能单纯依赖计算节点的核数,还需考虑数据分布、集群资源和业务的实际需求。因为一个高效的partition...

Kafka分区数量设置详解
分区数量越多,理论上集群吞吐量越大。但分区过多会导致客户端和服务器端的内存使用增加,线程和socket开销变大,文件句柄数增多,降低高可用性。确定分区数量时,可根据topic的producer吞吐量(Tp)和consumer吞吐量(Tc)计算,目标吞吐量(Tt)除以max(Tp, Tc)即为分区数。消息分配到分区基于key值,相...

kafka分区数量限制
kafka分区数量是理论是无限的。但是无限多的分区也是会影响kafka和kafka所在的服务器的性能 。如何确定分区数量 可以遵循一定的步骤来尝试确定分区数:创建一个只有1个分区的topic,然后测试这个topic的producer吞吐量和consumer吞吐量。假设它们的值分别是Tp和Tc,单位可以是MB\/s。然后假设总的目标吞吐量是Tt...

如何确定Kafka的分区数,key和consumer线程数
可以看出,Kafka几乎就是随机找一个分区发送无key的消息,然后把这个分区号加入到缓存中以备后面直接使用——当然了,Kafka本身也会清空该缓存(默认每10分钟或每次请求topic元数据时)如何设定consumer线程数我个人的观点,如果你的分区数是N,那么最好线程数也保持为N,这样通常能够达到最大的吞吐量。超过N的配置只是浪费...

Kafka partition的数量问题
当然,kafka跟其他集群一样,可以横向扩展,再增加三个相同资源的broker,那传输速度即可达到18p。越多的分区需要打开更多的文件句柄 在kafka的broker中,每个分区都会对照着文件系统的一个目录。在kafka的数据日志文件目录中,每个日志数据段都会分配两个文件,一个索引文件和一个数据文件。因此,随着partition...

kafka中的topic为什么要进行分区
若没有分区,一个topic对应的消息集在分布式集群服务组中,就会分布不均匀,即可能导致某台服务器A记录当前topic的消息集很多,若此topic的消息压力很大的情况下,服务器A就可能导致压力很大,吞吐也容易导致瓶颈。 有了分区后,假设一个topic可能分为10个分区,kafka内部会根据一定的算法把10分区尽可能...

kafka的分区分配
可以采用批量消费模式,通过配置并发数来提升处理速度。在生产环境中,分区数、并发数和最大批量拉取数量的选择需要根据硬件配置和数据量来调整,以确保最佳性能并避免GC问题。总结来说,Kafka的分区分配策略对性能和资源利用至关重要,理解并优化这一过程对确保系统的稳定和高效运行至关重要。

Kafka分区分配策略
在 Kafka内部存在两种默认的分区分配策略:Range和 RoundRobin,StickyAssignor。Range是默认策略。Range是对每个Topic而言的(即一个Topic一个Topic分),首先对同一个Topic里面的分区按照序号进行排序,并对消费者按照字母顺序进行排序。然后用Partitions分区的个数除以消费者线程的总数来决定每个...

相似回答