Kafka重启出错:Corrupt index found,

本文详细解析了Kafka进程在遭遇强制退出后重启时遇到的Fatal error问题,并提供了具体的解决方案,涉及Kafka的日志段(log segment)及其索引文件的格式与处理步骤。
部署运行你感兴趣的模型镜像

Kafka进程被强制退出(kill -9)后重启,碰到如下问题:

FATAL Fatal error during KafkaServerStable startup. Prepare to shutdown (kafka.server.KafkaServerStartable)
java.lang.IllegalArgumentException: requirement failed: Corrupt index found, index file (/home/kafka/kafka_2.9.2-0.8.1/logs/sampleTopic-1/00000000000006911940.index) has non-zero size but the last offset is 6911940 and the base offset is 6911940


之前的分析有误,还请见谅。

内容会陆续更新:

Kafka log Segment的index文件格式:
首先需要指出,.index文件不是为每个消息都指定到物理位置的映射;举个例子,假设有20000~20009共10条消息,.index文件可配置为每条entry
指定连续10条消息的物理位置映射,该例中,index entry会记录偏移量为20000的消息到其物理文件位置,一旦该条消息被定位,20001~20009可以很快查到。
每个entry大小8字节,定义了消息和其在文件中物理位置的映射;
前4个字节是这个消息相对于该log segment第一个消息offset的相对偏移量,后4个字节是这个消息在log文件中的物理位置;
Kafka启动时加载log的步骤:
  以一个partition log目录为例::

<1> 首先删除所有后缀名为.cleaned和.delete的文件:
<2> 对于.swp结尾的文件,如果是log文件则直接恢复(去掉.swp, 变为.log);
                        如果是index文件直接删掉(然后rebuild index文件);
<3> 对于.index文件,如果没有对应的.log文件(同一个logSement其index和log的主文件名相同), 则删除该index文件;
<4> 对于.log文件,加载如内存;如果其没有对应的.index文件(可能在第<2>步中被删除), 重新恢复其index文件;
<5> 假设到这一步为止Kafka还没有加载到logSements, 说明该partition log目录下为空,一个新的log sement对象会被创建在内存;
    反之则转向第<6>步;
<6> 如果Kafka已经加载到log, 最会开始recover log segments。

        至于为什么要recover log segments, 是因为大多数情况下,recover的目的就是检查Kafka上次关闭时是不是cleanShutDown (可通过检查partition log目录下是不是有后缀名为.kafka_cleanshutdown的文件确定);
        如果是cleanShutDown(后缀名为.kafka_cleanshutDown的文件存在),则无需recover log segment;
        如果不是cleanShutDown, 则需要recover log segments;
    <6.1> 这里解释下什么是recover a log segment?
        在非cleanShutDown情况下, 一个log sement的log及index文件末尾可能有一些不合法的数据(invalid), 我们需要把它们截掉;
        首先要做的最简单检查,是log或index文件大小不能超过配置中设定的值(比方说一个.log文件中被设定最多保存10000条消息,超过10000条的都要抛弃掉);     
<7> 最后做sanityCheck, 主要是检查每个log sement的index文件,确保不会加载一个出错的Log Segment;


本文开头的错误就是在第<7>步中检测到的。

好久没更新了,记录下自己后来的解决方案:

删除每个topic-partition目录下的*.index文件,重启Kafka server, 如果数据多的话,rebuild index会花较长时间。等索引重新创建完成,kafka就能正常工作了。

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

### 配置 Kafka 以避免 Bash 中 Command Not Found 错误 在 Linux 系统中,如果遇到 `command not found` 的错误,通常是因为环境变量 PATH 中缺少指向 Kafka 命令的路径。以下是具体的解决方案: #### 修改环境变量 PATH 为了使系统能够识别 Kafka 命令,需要将其安装目录下的 `bin` 文件夹路径添加到系统的 PATH 变量中。可以通过编辑用户的 `.bashrc` 或者全局 `/etc/profile` 文件来实现。 ```bash export KAFKA_HOME=/path/to/kafka # 替换为实际的 Kafka 安装路径[^1] export PATH=$KAFKA_HOME/bin:$PATH ``` 上述代码片段应被追加至用户主目录中的 `.bashrc` 文件或者全局配置文件 `/etc/profile` 中。完成此操作后,需重新加载该文件以便更改生效。 ```bash source ~/.bashrc # 或者对于全局配置 source /etc/profile ``` #### 处理潜在的 Shell 脚本兼容性问题 有时即使设置了正确的 PATH,仍然可能由于脚本本身的编码差异引发执行失败的情况。这通常是因 Windows 和 Unix/Linux 行结束符的不同所致[^2]。可以利用工具如 `dos2unix` 来转换这些脚本文件的行结束符,从而消除此类冲突。 ```bash sudo apt-get install dos2unix # 如果尚未安装的话先进行安装 cd $KAFKA_HOME/bin # 进入 Kafka bin 目录 dos2unix *.sh # 将所有的 .sh 文件从 DOS 格式转成 UNIX 格式 ``` 通过以上步骤,应该能有效解决 bash 下 kafka command not found 的问题,并确保所有相关 shell 脚本能正常工作于 Linux 平台上。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值