Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 卡夫卡原木清理机坠毁_Java_Apache Kafka - Fatal编程技术网

Java 卡夫卡原木清理机坠毁

Java 卡夫卡原木清理机坠毁,java,apache-kafka,Java,Apache Kafka,请注意,我已经阅读了很多以下文章,并尝试在不同论坛上查找相关信息,但没有成功: 希望您能理解我的问题并提供一些线索=) 故事是这样的: 几天前,我们在kafka群集上部署了重复数据消除服务。 自从我们使用这项服务以来,我们注意到消费者的话题开始增长。 原因是日志清理器(用于压缩此主题和其他主题)发生以下错误而崩溃: java.lang.IllegalStateException:此日志包含的消息大于最大允许大小1000012 根据我们的理解,我们首先认为这是一个消息大小问题,因此我们增加了max

请注意,我已经阅读了很多以下文章,并尝试在不同论坛上查找相关信息,但没有成功: 希望您能理解我的问题并提供一些线索=)

故事是这样的:

几天前,我们在kafka群集上部署了重复数据消除服务。 自从我们使用这项服务以来,我们注意到消费者的话题开始增长。 原因是日志清理器(用于压缩此主题和其他主题)发生以下错误而崩溃: java.lang.IllegalStateException:此日志包含的消息大于最大允许大小1000012

根据我们的理解,我们首先认为这是一个消息大小问题,因此我们增加了max.messsage.bytes(直到超过20 MB)值,但随后我们得到了相同的问题(错误消息用新值正确更新)

因此,我们开始认为这可能是某种“损坏的”消息大小值或“误解的段”(比如kafka log cleaner版本没有正确处理消息)

我们能够分离出引起问题的线段偏移。这很奇怪,因为当我们使用一个简单的消费者时,记录大约是4K字节,但是消费者只使用这个记录需要7到8分钟(在这个轮询过程中,tcpdump清楚地显示了来自代理的许多>1000字节的数据包)

因此,我们开始使用dumpSegment类来查看段,它看起来是这样的(我替换了一些值以进行匿名化):

所以我们看到了很多像上面这样的束

然后是使log cleaner崩溃的错误偏移量:

baseOffset: 4740626096 lastOffset: 4740626096 count: 1 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 50 isTransactional: false isControl: false position: 50471272 CreateTime: 1557322162912 size: 4447 magic: 2 compresscodec: NONE crc: 3030806995 isvalid: true

| offset: 4740626096 CreateTime: 1557322162912 keysize: 25 valuesize: 4352 sequence: -1 headerKeys: [] key: {"metadata":"MYGROUPID"} payload: {"protocolType":"consumer","protocol":"range","generationId":32,"assignment":"{CLIENTID=[TOPICA-0, TOPICA-1, TOPICA-2, TOPICA-3, TOPICA-4, TOPICA-5, TOPICA-6, TOPICA-7, TOPICA-8, TOPICA-9, TOPICA-10, TOPICA-11], AND THIS FOR ABOUT 10 OTHER TOPICS}"}  ==> approximative 4K bytes
这看起来不像标准的u_消费者_offset数据模式(即[groupId,topicName,partitionNumber]::offset模式),我认为这是因为新服务使用了kafka事务

我们认为这次崩溃可能是因为我们的kafka群集是0.9.11(或者可能是1.0.1),而我们的重复数据消除服务使用的是kafka 2.0.0 API(以及使用事务)

下面是我的一些疑问:

  • 在处理kafka事务时,消费者补偿主题如何处理提交的补偿?我一点也不了解结构。。似乎有多个提交标记消息(但不知道它是什么主题或分区..那么这是如何工作的:/?)总是跟在这个包含元数据标记的非事务NNAL记录后面。。有关于这个结构的文件吗

  • 1.1.0 kafka cluster的log cleaner版本是否可能无法正确处理消费者偏移量中的此类事务性消息(使用2.0.0 API提供)

欢迎在此提供任何线索/更正

再加上


Yannick

经过一些研究,我发现了为什么我们会有这样的行为,并找到了解决办法

这是一个众所周知的卡夫卡bug,它至少影响了卡夫卡的1.1.0版本:

解决方案:简单的方法是升级到版本2(或1.1.1,如您在Jira中看到的那样处理它)

这是因为段中充满了事务标记,当达到删除保留时间以除去这些标记时,在压缩过程中,LogCleaner崩溃(试图将其缓冲区加倍)

如果您想了解更多有关分段结构的详细信息以及LogCleaner崩溃的确切方式,请参阅本文中的更多信息和研究:

扬尼克

baseOffset: 4740626096 lastOffset: 4740626096 count: 1 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 50 isTransactional: false isControl: false position: 50471272 CreateTime: 1557322162912 size: 4447 magic: 2 compresscodec: NONE crc: 3030806995 isvalid: true

| offset: 4740626096 CreateTime: 1557322162912 keysize: 25 valuesize: 4352 sequence: -1 headerKeys: [] key: {"metadata":"MYGROUPID"} payload: {"protocolType":"consumer","protocol":"range","generationId":32,"assignment":"{CLIENTID=[TOPICA-0, TOPICA-1, TOPICA-2, TOPICA-3, TOPICA-4, TOPICA-5, TOPICA-6, TOPICA-7, TOPICA-8, TOPICA-9, TOPICA-10, TOPICA-11], AND THIS FOR ABOUT 10 OTHER TOPICS}"}  ==> approximative 4K bytes