kafka模拟消费报错 ISR缺失 指定offset提取数据失败场景

芒果1年前技术文章647

测试集群信息
kafka版本:3.0.0
172.16.120.236  kafka-id: 0
172.16.121.150  kafka-id: 1
172.16.121.225  kafka-id: 2
背景描述 
客户消费kafka中某一个topic的分区数据到达指定offset 就消费报错了 而且ISR副本也会同步失败 
本文要做的是模拟拿出出问题的那个offset
创建一个测试topic
kafka-topics.sh --create --bootstrap-server emr1:9092,emr2:9092,emr3:9092   --replication-factor 3 --partitions 3 --topic kafka-check

791484B3-4882-473A-831D-72C7A1DD205E.png
编写一个脚本不断往里面写入数据
#!/bin/bash
while true
do
    # 生成随机数据
    data=$(head /dev/urandom | tr -dc 'a-zA-Z0-9' | head -c 1000)
    # 向 Kafka topic 写入数据
    echo "$data" | /opt/dtstack/Kafka/kafka/bin/kafka-console-producer.sh --broker-list emr1:9092,emr2:9092,emr3:9092 --topic kafka-check

done
消费看下
kafka-console-consumer.sh --bootstrap-server emr1:9092,emr2:9092,emr3:9092 --topic kafka-check

image.png

查看下当前分区情况

kafka-topics.sh --bootstrap-server  emr1:9092,emr2:9092,emr3:9092 --topic kafka-check --describe
FE92705A-F960-4E1F-BE87-D31E1580C616.png
查看test消费组消费的情况
kafka-consumer-groups.sh --bootstrap-server emr1:9092,emr2:9092,emr3:9092  --describe --group test
32BD1056-F044-4FB8-8F12-69733B6C5333.png
例如分区0 当前offset:2827  最后offset:4346 滞后量:1519
比如现在我想拿到分区0的2828的offset数据
根据上图查看的分区情况来看的话 0分区的Leader在2上 我们就去kafka的id 2机器上
指定offset消费数据 犹豫我们要拿出的那个offset数据是指定offset消费不出来的
为了测试更加准确定 我们提前看一下2828的结果吧
kafka-console-consumer.sh --bootstrap-server emr1:9092,emr2:9092,emr3:9092   --topic  kafka-check  --partition 0   --offset 2828 | head -1
结尾:jMxMWtwOCzdyr7v4hLl
F396EDE3-0EC4-4C3E-AFF7-03856A00D418.png
ok那我们继续测试
指定offset消费 1条从2827开始
kafka-console-consumer.sh --bootstrap-server emr1:9092,emr2:9092,emr3:9092   --topic  kafka-check  --partition 0   --offset 2827 | head -1
结尾:qI12ZjInjzOetudzQH
BC1DA289-F19F-4A05-B6C4-D8EF3BB1E536.png
然后我们去数据目录(Leader的节点)
cd /data/kafka/logs/kafka-check-0/
ll
FB57D54D-3EA3-4690-B8F9-07DD7CDB797B.png
搜索这个数据
grep -Rn "qI12ZjInjzOetudzQH"
E9B187D2-A969-4673-A8BF-D6455D096207.png
匹配到文件 进入这个二进制文件

搜索qI12ZjInjzOetudzQH

image.png

由于是二进制文件 看起来会比较乱 但是细心点可以发现 我们已经找到了2828的offset数据
更好的办法
执行strings显示16进制
strings -a -t x 00000000000000002734.log  | grep qI12ZjInjzOetudzQH
D0BE0847-51B8-413E-A76D-B1EFAD211C09.png
思路先追加到一个文件中 然后cat -n拿到行数 输出下一行就可以了
strings -a -t x 00000000000000002734.log > /opt/00000000000000002734.log
cat 00000000000000002734.log | grep qI12ZjInjzOetudzQH
cat -n 00000000000000002734.log | grep qI12ZjInjzOetudzQH

接下来提取97行数据就可以
但是要注意在提取大型文件的数据是cat性能消耗是比较大的 
可以使用sed
sed -n '97p' 00000000000000002734.log
    A1C8DE39-B196-42E5-B211-86E93162FB3E.png


相关文章

Hive 重新编译-解决Tez JobName的问题

Hive 重新编译-解决Tez JobName的问题

本文采用linux编译首先下载源码https://dlcdn.apache.org/hive/hive-3.1.2/apache-hive-3.1.2-src.tar.gz源码位置ql/src/jav...

Gartner权威报告解读|应用可观测性列为2023年重要战略技术趋势!

Gartner于今日发布企业机构在2023年需要探索的十大战略技术趋势。Gartner杰出研究副总裁Frances Karamouzis表示:“为了在经济动荡时期增加企业机构的盈利,首席信息官和IT高...

HBase使用snappy压缩

HBase使用snappy压缩

安装编译环境依赖yum install -y automake autoconf gcc-c++ cmake libedit libtool openssl-devel ncurses-devel安装...

HDP实操--NameNode开启高可用

HDP实操--NameNode开启高可用

为了确定在namenode组件失败后集群中有其他的namenode可以工作,需要对hdp集群配置高可用,当前我们配置的非安全集群的高可用。前置条件:(1)确保你的集群至少有3个节点并且至少有3个Apa...

Hive优化之Spark执行引擎的参数优化(二)

Hive优化之Spark执行引擎的参数优化(二)

        Hive是大数据领域常用的组件之一,主要是大数据离线数仓的运算,关于Hive的性能调优在日常工作和面试中...

ES运维(八)添加IK分词器

ES运维(八)添加IK分词器

一、概述ES自带standard analyzer、simple analyzer、whitespace analyzer、stop analyzer、language analyzer、patter...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。