如何使用kafka.consumer.SimpleConsumer,seek()

时间:2015-08-05 20:11:36

标签: python apache-kafka kafka-consumer-api kafka-python

API文档位于:http://kafka-python.readthedocs.org/en/latest/apidoc/kafka.consumer.html

但是当我运行以下代码时,异常是%d格式:需要一个数字,而不是NoneType

    client = KafkaClient("localhost:9092")
    consumer = SimpleConsumer(client, "test-group", "test")
    consumer.seek(0, whence=None)# (0,2) and (0,0)
    run = True
    while( run ):
        message = consumer.get_message(block=False, timeout=4000)

    except Exception as e:
        print "Exception while trying to read msg:", str(e)

当我使用下面的代码时,例外是 seek()得到了一个意外的关键字参数' partition'

consumer.seek(0, whence=None, partition=None)# (0,2) and (0,0)

有什么想法吗?感谢。

1 个答案:

答案 0 :(得分:0)

在《卡夫卡权威指南》中,有一个用Java(不是Python)编写的seek()示例代码。

public class SaveOffsetsOnRebalance implements ConsumerRebalanceListener {

         public void onPartitionsRevoked (Collection <TopicPartition> partitions) {
                  commitDBTransaction();
         }

         public void onPartitionsAssigned(Collection <TopicPartiton> partitions) {
              for(TopicPartition partition : partitions)
                  consumer.seek(partition, getOffsetFromDB(partition));
         }

     }
}   // these brackets are exactly the same as the book. I didn't change anything. You might want to though.    

   consumer.subscribe (topics, new SaveOffsetOnRebalance(consumer));
   consumer.poll(0);

   for ( TopicPartition partition : consumer.assignment())
       consumer.seek(partition, getOffsetFromDB(partition));

   while (true) {
         ConsumerRecords <String, String> records = consumer.poll(100);
         for (ConsumerRecord <String, String> record : records)
         { 
               processRecord(record);
               storeRecordInDB(record);
               storeOffsetInDB(record.topic(), record.partition(), record.offset());
         }
         commitDBTransaction();
   }