当前位置: 首页 > 知识库问答 >
问题:

Kafka主题在一个分区中具有更多数据

龙哲
2023-03-14

我们使用的是 Kafka 2.5.1 版本集群。最近注意到其中一个主题分区数据大小不均匀。与其余分区相比,一个特定分区的大小增加了 300%。这在群集中造成了不均衡的磁盘利用率。

已验证使用者滞后,看起来像其他分区一样正常 此外,我们使用默认分区程序和设置为默认值的“metadata.max.age.ms”配置,即 300000ms(5 分钟)

我们是如何使分区数据均匀分布的?

共有2个答案

沈曜灿
2023-03-14

为了补充@OneCricketeer答案,我建议首先弄清楚您的事件键是什么,以及哪个键在您的主题中造成了如此巨大的不平衡......为此,我会:

>

  • 检查“大”分区和“普通”分区中的数据。您可以使用以下命令查看kafka数据日志中的事件,例如:

    /usr/bin/kafka转储日志--打印数据日志--files/apps/kafka data/trackin.ap.client.transport.keyed-1/00000000000004735501.log

    [当然,用您自己的kafka日志目录、主题名、分区号和日志文件名替换]

    您将看到以下内容:

    偏移量:4736628位置:676217 创建时间:1622043813有效:真 密钥大小:8 值大小:506 魔术:2 压缩编解码器:无 生产者 ID:-1 生产者纪元:-1 序列:-1 是事务性:假标头键:[] 键:123 有效负载:{“CID”:“123”,

    事件的键是“键:123”部分。

    比较两个分区中的键分布,并尝试找到“大”分区中的罪魁祸首键值-您可以编写一个简单的awk/bash脚本,通过不同的键值来计算日志中的事件数,或者这可能很明显

    现在你知道了什么是关键,哪个关键(或者几个关键)是问题所在——你可以开始考虑如何解决这个问题了。这可能非常简单——如果对事件分组没有硬性要求,并且您可以将键更改为UUID或其他一些分布良好的字段值。或者这可能很难——如果这样设计是有原因的,并且您必须将同一个键的所有事件(比如说CustomerID)保存在同一个分区中——如果您正在您的消费者中做一些工作,这些工作依赖于在同一个消费者线程中处理同一个键的所有事件(例如,一些内存中的聚合)。在这种情况下,如果均匀地重新分布主题中的数据很重要(通常是这样),您可能必须重新考虑您的应用程序/消费者逻辑

  • 锺英卫
    2023-03-14

    作为操作员,什么也做不了;尤其是因为消费者依赖于该分区分配和消息排序。

    Kafka不保证非空密钥会均匀分布。您需要修改生产者,以便分区方案均匀地分布数据。

    例如,默认情况下,如果80%的记录具有相同的<code>hash(key)</code>,那么它们都会被发送到同一分区,导致该分区比其他20%的总和大4倍。您可以编写自己的partitioner来改变这种行为,但是如果您有多语言的客户机都针对同一主题进行创作,那么您将面临大量重复的工作

     类似资料:
    • 我有一个带有2个分区的源主题,我正在用同一个应用程序启动2个kafka streams应用程序。id,但不同的接收器主题。 1) 这两个应用程序实例是否会从不同的分区接收数据? 2)如果其中一个应用程序被杀死,另一个实例会自动从两个实例中消耗吗? 3) 我如何证明上述情况?

    • 我们希望使用Kafka connect sink连接器将消息从Kafka复制到Mongo DB。在我们的用例中,我们有多个主题,每个主题都有一个分区(主题的名称可以用正则表达式表示,例如topic.XXX.name)。这些主题的数量在不断增加。我想知道Kafka connect架构是否适合这个用例。如果是这样,如何配置它的增益高可缩放性和并行性?任务是什么。最大值?工人数量?

    • 我使用的是Kafka 0.8.2,而我的使用者却出现了一个错误:“OFFSET commit FAILL with...”。当查看主题“__consumer_offsets”时。我看到它有50个分区计数。正常吗?我只能通过删除所有的Kafka日志并重新启动我的Kafka服务器来解决这个问题。是否有一种方法,我可以删除这个主题时,它达到一定数量的分区,还是我提交的偏移量是错误的? 下面是我提交偏移的

    • 通过Kafka文档和各种其他资源,我了解到Kafka中的消息被组织成主题。此外,主题可以分解为多个分区,每个分区可以托管在不同的服务器上。这提供了冗余和可伸缩性。 我不确定这里的“破碎”这个词是什么意思。这是否意味着,如果添加到主题的消息是,例如“1 2 3 4 5 6 7”,那么在将其分解为分区后,我们将有一个分区仅包含整个主题的子部分。就像一个分区有“1 2 3”,而另一个分区有“4 5 6”

    • Kafka主题分区偏移位置始终从0或随机值开始,如何确保使用者记录是分区中的第一条记录?有没有办法找出答案?如果有的话,请让我知道。谢谢。

    • 我正在学习Kafka,并试图为我最近的搜索应用程序创建一个主题。被推送到Kafka主题的数据被认为是一个很高的数字。 我的kafka集群有3个代理,并且已经为其他要求创建了主题。 现在,我应该为最近的搜索主题选择多少个分区?如果我没有明确提供分区号呢?选择分区号时需要考虑哪些事项?