日更挑战当前排名:第93天,第3104名,较昨日前进31名。
最近折腾公司的大数据平台,遇到了一个Kafka的消费者消费时无法正常启动,报afka.common.OffsetOutOfRangeException
的错误。俗称就是Offset的数组越界。
其实到撰文的时候,问题还未解决,先把之前的思路理一理。
根据网上的教程,先查看当前我们这个topic有几个分区,具体命令如下
$ {KAFKA_HOME}/bin/kafka-topics --zookeeper localhost:2181 --topic TEST_TOPIC --describe
查出来目前是6个分区(0-5)。同时由于kafka的broker有4个,会发现每个分区都有两个broker承载数据,其中一个为leader。
其次看zookeeper中对应的offset位移是多少。这里比较奇怪的是,我只能在/brokers/topics/TEST_TOPIC/partitions/0
(0可替换为1-5)中找到offset。而不是如网上说的在consumer/消费者组这个路径下。另外在以上路径中,看到值为null,所以尝试找到正确的offset并重置。
这时通过两个途径找,首先是看目录。从Kafka的配置里找到log.dirs,再去各个broker中找这个参数指定的目录,注意不是每个broker都有所有的分区数据,我这边一个broker基本有3个分区,或者作为leader,或者作为replica。
某个分区日志记录这里其实分辨不出哪个是earliest,哪个是lastest,特别的和第二种方法还不太一致。
第二个途径是使用命令,通过kafka-run-class
命令可以运行一些Kafka提供的类进行管理。
$ {KAFKA_HOME}/bin/kafka-run-class kafka.tools.GetOffsetShell --broker-list=localhost:9092 --topic TEST_TOPIC --time -2
其中-2是最小值,-1是最大值。
这个运行出来的结果,有些和第一种方法对不上。
我在zk上使用第二种方法set了offset,但是重启原来的yarn job,问题还是没有解决。
(等一旦解决,第一时间更新或另发文分享!)
网友评论