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

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

直接上代码:

# coding=utf8

from confluent_kafka import Consumer, KafkaError, TopicPartition

def reset(topic, group, partition, new_offset):
broker_list = "xx.xx.xx.xx:9092,xx.xx.xx.xx:9092"
new_offset = int(new_offset) - 1 #从new_offset-1的地方开始消费,这样消费一条后提交就是new_offset位置
tp_c = TopicPartition(topic, partition, new_offset)
c = Consumer({'bootstrap.servers': broker_list,
'group.id': group,
'enable.auto.commit': True, # 把自动提交打开
'default.topic.config': {'auto.offset.reset': 'smallest'}})
c.assign([tp_c])
c.poll() def reset_offset(topic, group, partition, new_offset):
while True:
try:
reset(topic, group, partition, new_offset)
break
except:
print "ERROR in reset, repeat."
continue if __name__ == "__main__":
reset_offset("test1", "test1", 0, 100)

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

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

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

# coding=utf8

from confluent_kafka import Consumer, KafkaError, TopicPartition

def reset(topic, group):
broker_list = "xx.xx.xx.xx:9092,xx.xx.xx.xx:9092"
c = Consumer({'bootstrap.servers': broker_list,
'group.id': group,
'enable.auto.commit': False,
'default.topic.config': {'auto.offset.reset': 'smallest'}})
c.subscribe([topic]) # 这一句必须有,否则后面get_watermark_offsets会报错 Failed to get watermark offsets: Broker: Leader not available
tp = TopicPartition(topic, 0)
committed = c.committed([tp]) # 这一句必须有,否则后面get_watermark_offsets会报错 Failed to get watermark offsets: Broker: Leader not available
print "committed: %s" % committed[0].offset
watermark_offsets = c.get_watermark_offsets(tp)
print "watermark_offsets:%s %s" % (watermark_offsets[0], watermark_offsets[1])
new_offset = int(watermark_offsets[1]) - 1
print new_offset
tp_c = TopicPartition(topic, 0, new_offset) c = Consumer({'bootstrap.servers': broker_list,
'group.id': group,
'enable.auto.commit': True, # 把自动提交打开
'default.topic.config': {'auto.offset.reset': 'smallest'}})
c.assign([tp_c])
c.poll() def reset_offset(topic, group):
while True:
try:
reset(topic, group)
break
except:
print "ERROR in reset, repeat."
continue if __name__ == "__main__":
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. mui列表系列

    详细操作见代码: <!doctype html> <html> <head> <meta charset="UTF-8"> < ...

  2. 「LibreOJ Round #6」花火

    转化思维的好题! 链接:here 大致题意: 有$ n$个数字,你每次可以交换相邻两个,还有一次交换任意两个元素的机会,求最少的交换次数使得这些数字升序排序(原数列两两不同) $ solotion:$ ...

  3. 算法 - 链的操作(三) - 返回倒数第k个节点(no.23)

    输入一个链 : 1 -> 3 -> 5 -> 6 -> 8 输入 k  = 2 返回 6 这个节点 python(2.7) def getNode(head, k): if(h ...

  4. Javascript入门(三)函数

    Javascript函数 一.函数定义与执行 <script type="text/javascript"> //define function fun1(){ ale ...

  5. About me & OI这一年

    1 最近碰到一些 OIers 问我学 OI 的经历 回忆了一下,我做的第一道题是A+B Problem,时间:2018年2月15日 呀,正好一年了 2 我是来自 HB 的 OIer 一枚 现在高一,就 ...

  6. 【SVN】CentOS7.0下搭建SVN服务器

    SVN服务器搭建 最近接手了天赋吉运的SVN项目管理,那么学会搭建SVN服务器就成为了必须的技能.这篇文章就来讲一讲在CentOS7.0下如何搭建SVN服务器 1,下载安装SVN版本 yum inst ...

  7. Pytorch tutorial 之Datar Loading and Processing (2)

    上文介绍了数据读取.数据转换.批量处理等等.了解到在PyTorch中,数据加载主要有两种方式: 1. 自定义的数据集对象.数据集对象被抽象为Dataset类,实现自定义的数据集需要继承Dataset. ...

  8. 查询tensorflow中的函数用法

    一下均在ubuntu环境下: (1)方法一,使用help()函数: 比如对于tf.placeholder(),在命令行中输入import tensorflow as tf , help(tf.plac ...

  9. H5混合开发app常用代码

    1.Android与H5互调可以让我们的实现混合开发,至于混合开发就是在一个App中内嵌一个轻量级的浏览器(高性能webkit内核浏览器),一部分原生的功能改为Html 5来开发.然后这个浏览器又封装 ...

  10. MongoDB 的 upsert

    MongoDB 的update 方法的三个参数是upsert,这个参数是个布尔类型,默认是false.当它为true的时候,update方法会首先查找与第一个参数匹配的记录,在用第二个参数更新之,如果 ...