之前写过两篇关于重置offset的博文,后来使用过程中都有问题。

经过各种尝试,终于找到了解决方案。

直接上代码:

  1. # coding=utf8
  2.  
  3. from confluent_kafka import Consumer, KafkaError, TopicPartition
  4.  
  5. def reset(topic, group, partition, new_offset):
  6. broker_list = "xx.xx.xx.xx:9092,xx.xx.xx.xx:9092"
  7. new_offset = int(new_offset) - 1 #从new_offset-1的地方开始消费,这样消费一条后提交就是new_offset位置
  8. tp_c = TopicPartition(topic, partition, new_offset)
  9. c = Consumer({'bootstrap.servers': broker_list,
  10. 'group.id': group,
  11. 'enable.auto.commit': True, # 把自动提交打开
  12. 'default.topic.config': {'auto.offset.reset': 'smallest'}})
  13. c.assign([tp_c])
  14. c.poll()
  15.  
  16. def reset_offset(topic, group, partition, new_offset):
  17. while True:
  18. try:
  19. reset(topic, group, partition, new_offset)
  20. break
  21. except:
  22. print "ERROR in reset, repeat."
  23. continue
  24.  
  25. if __name__ == "__main__":
  26. reset_offset("test1", "test1", 0, 100)

代码中的while循环是防止有时连不上kafka服务器报错。

很奇怪,我直接用c.commit(offsets=[tp_c])不起作用,非要我消费后它自动重置才有效。

附,重置offset到最大值的操作。比上面多出了获取最大值的部分代码。

  1. # coding=utf8
  2.  
  3. from confluent_kafka import Consumer, KafkaError, TopicPartition
  4.  
  5. def reset(topic, group):
  6. broker_list = "xx.xx.xx.xx:9092,xx.xx.xx.xx:9092"
  7. c = Consumer({'bootstrap.servers': broker_list,
  8. 'group.id': group,
  9. 'enable.auto.commit': False,
  10. 'default.topic.config': {'auto.offset.reset': 'smallest'}})
  11. c.subscribe([topic]) # 这一句必须有,否则后面get_watermark_offsets会报错 Failed to get watermark offsets: Broker: Leader not available
  12. tp = TopicPartition(topic, 0)
  13. committed = c.committed([tp]) # 这一句必须有,否则后面get_watermark_offsets会报错 Failed to get watermark offsets: Broker: Leader not available
  14. print "committed: %s" % committed[0].offset
  15. watermark_offsets = c.get_watermark_offsets(tp)
  16. print "watermark_offsets:%s %s" % (watermark_offsets[0], watermark_offsets[1])
  17. new_offset = int(watermark_offsets[1]) - 1
  18. print new_offset
  19. tp_c = TopicPartition(topic, 0, new_offset)
  20.  
  21. c = Consumer({'bootstrap.servers': broker_list,
  22. 'group.id': group,
  23. 'enable.auto.commit': True, # 把自动提交打开
  24. 'default.topic.config': {'auto.offset.reset': 'smallest'}})
  25. c.assign([tp_c])
  26. c.poll()
  27.  
  28. def reset_offset(topic, group):
  29. while True:
  30. try:
  31. reset(topic, group)
  32. break
  33. except:
  34. print "ERROR in reset, repeat."
  35. continue
  36.  
  37. if __name__ == "__main__":
  38. reset_offset("test1", "test1")

注意: subscribe和assign是不能同时使用的。subscribe表示订阅topic,从kafka记录的offset开始消费。assign表示从指定的offset开始消费。

问题:

1.为何获取watermark_offsets必须要使用subscribe和committed,不使用就报错Failed to get watermark offsets: Broker: Leader not available?

2.c.commit(offsets=[tp]) 在什么情况下有效?

【kafka】confluent_kafka重置offset的更多相关文章

  1. kafka reset offset 手工重置offset

    1.场景 a)有时消费端逻辑修改,需要重复消费数据,需要将offset设置到指定位置. 2.实现 kafka版本:0.11.* KIP-122: Add Reset Consumer Group Of ...

  2. kafka重置offset

    kafka重置offset   1.删除zookeeper上节点信息 打开client :./zkCli.sh -server 127.0.0.1:12181 删除consumer:rmr /cons ...

  3. 【python】confluent_kafka将offset置为最大

    该博文方法有问题,正确方案在http://www.cnblogs.com/dplearning/p/7992994.html 将指定group对应的offset重置到最大值,跳过未消费数据 代码如下: ...

  4. 【Spark】Spark Streaming + Kafka direct 的 offset 存入Zookeeper并重用

    Spark Streaming + Kafka direct 的 offset 存入Zookeeper并重用 streaming offset设置_百度搜索 将 Spark Streaming + K ...

  5. Kafka设计解析(十二)Kafka 如何读取offset topic内容 (__consumer_offsets)

    转载自 huxihx,原文链接 Kafka 如何读取offset topic内容 (__consumer_offsets) 众所周知,由于Zookeeper并不适合大批量的频繁写入操作,新版Kafka ...

  6. Spark Streaming消费Kafka Direct保存offset到Redis,实现数据零丢失和exactly once

    一.概述 上次写这篇文章文章的时候,Spark还是1.x,kafka还是0.8x版本,转眼间spark到了2.x,kafka也到了2.x,存储offset的方式也发生了改变,笔者根据上篇文章和网上文章 ...

  7. Kafka Topic Partition Offset 这一长串都是啥?

    摘要:Offset 偏移量,是针对于单个partition存在的概念. 本文分享自华为云社区<Kafka Topic Partition Offset 这一长串都是啥?>,作者: gent ...

  8. kafka手动设置offset

    项目中经常有需求不是消费kafka队列全部的数据,取区间数据 查询kafka最大的offset: ./kafka-run-class.sh kafka.tools.GetOffsetShell --b ...

  9. Kafka 如何读取offset topic内容 (__consumer_offsets)

    众所周知,由于Zookeeper并不适合大批量的频繁写入操作,新版Kafka已推荐将consumer的位移信息保存在Kafka内部的topic中,即__consumer_offsets topic,并 ...

随机推荐

  1. mysql 修改文件记录:

    增:  insert  t1(id, name) values(1, "alex"), (2, "wusir"), (3, "dabing" ...

  2. pwnable.kr col

    collision - 3 pt 连接上查看col.c源码 分析一下代码, 1.hashcode等于一个固定的值 2.check_password函数取输入数据,4个一组,将输入的字符转成int,然后 ...

  3. IBM 3650 M3 yum upgrade后系统无法登陆问题

    一.背景 IBM 3650 M3安装了centos7.2操作系统 今天yum upgrade升级centos7.6,重启系统后发现开不了机,报错如下: Failed to set MokListRT: ...

  4. Java HashMap、HashTable、TreeMap、WeakHashMap区别

    1.HashMap不是线程安全,而HashTable是线程安全

  5. bootstrap登录界面

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  6. 题解-bzoj4061 CERC-2012Farm and Factory

    Problem Please contact lydsy2012@163.com! 题意概要:给定\(n\)点\(m\)边无向图,设定两个起点为\(1,2\),现要求在图中增加一个点,并将这个点与其他 ...

  7. zTree:一个依靠 jQuery 实现的多功能 “树插件”

    官方网站: http://www.treejs.cn/v3/main.php#_zTreeInfo 使用方式: 步骤1.文件准备 将需要使用的 zTree v3.x 相关的 js.css.img 文件 ...

  8. sqlserver 2012 分页

    --2012的OFFSET分页方式 select number from spt_values where type='p' order by number offset 10 rows fetch ...

  9. 基于数组的循环队列(C++模板实现)

    循环队列使用数组实现的话,简单.方便.之前实现的队列,当尾端索引到达队列最后的时候,无论前面是否还有空间,都不能再添加数据了.循环队列使得队列的存储单元可以循环利用,它需要一个额外的存储单元来判断队列 ...

  10. django.db.utils.OperationalError: (1045, "Access denied for user 'ODBC'@'localhost' (using password)

    错误描述: 从SQLLITE数据库换为MYSQL数据库,执行 python manage.py migrate 命令时,报错:django.db.utils.OperationalError: (10 ...