Kaffa 按照时间重置 Topic 的所有分区 offset,时区问题?重置命令无效?
一、问题原因
本质是 Timestamp 转成 DateTime 会默认读取 JVM 的时区,导致我们指定参数的时间比实际 Kafka 重置 offset 时间早了 8 小时。
例如:我们指定参数的时间是 08:00:00 ,但是 kafka 内部的时间会以 16:00:00 重置 offset 。
如果我们指定的时间是 8 点,现在时间是 9点,还没有到16:00:00。 这样就会导致一个问题,重置命令一直会吧 offset 重置成最新的 offset。
二、解决方法
- 将启动 kafka 的脚本 添加启动参数,设置时区。
将下面的地方添加关键参数vim kafka-server-start.sh
-Duser.timezone=UTC+0800。
if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then export KAFKA_HEAP_OPTS="-Duser.timezone=UTC+0800 -server -Xms2G -Xmx2G -XX:PermSize=128m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:ParallelGCThreads=8 -XX:ConcGCThreads=5 -XX:InitiatingHeapOccupancyPercent=70" export JMX_PORT="9999" # export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G" fi
- 重启 Kafka,将消息清空后,重新发送到 kafka 的各分区。
bin/kafka-server-stop.sh stop bin/kafka-server-start.sh -daemon config/server.properties
三、重置Offset 与 查看结果
在重置之前要把 Kafka Group 和 Topic 关联起来,否则会报错。
-
先消费一条数据。
kafka-console-consumer.sh --bootstrap-server bigdata1:9092 --from-beginning -topic MyTopic -max-messages 1 -group ChestnutQiang
-
根据时间重置 Offset
# 这条命令从 kafka 0.11 才有效,在这之前需要用程序重置 kafka 的 offset。 kafka-consumer-groups.sh --bootstrap-server bigdata1:9092 --group ChestnutQiang --reset-offsets --topic MyTopic --to-datetime 2021-01-28T08:00:00.000 --execute TOPIC PARTITION NEW-OFFSET MyTopic 1 9135 MyTopic 5 9112 MyTopic 4 9142 MyTopic 0 9279 MyTopic 2 9179 MyTopic 3 9121
-
查看一下各分区当前 Offset 、最新 Offset 、积压多少条消息。
kafka-consumer-groups.sh --bootstrap-server bigdata1:9092 --group ChestnutQiang --describe TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID MyTopic 1 9135 12405 3270 - - - MyTopic 5 9112 12403 3291 - - - MyTopic 4 9142 12445 3303 - - - MyTopic 0 9279 12574 3295 - - - MyTopic 2 9179 12427 3248 - - - MyTopic 3 9121 12394 3273 - - -