Python Kafkaの高レベルコンシューマを使用しています。トピックの各パーティションの最新のオフセットを知りたいのですが、動作させることができません。
from kafka import TopicPartition
from kafka.consumer import KafkaConsumer
con = KafkaConsumer(bootstrap_servers = brokers)
ps = [TopicPartition(topic, p) for p in con.partitions_for_topic(topic)]
con.assign(ps)
for p in ps:
print "For partition %s highwater is %s"%(p.partition,con.highwater(p))
print "Subscription = %s"%con.subscription()
print "con.seek_to_beginning() = %s"%con.seek_to_beginning()
しかし、私が得る出力は
For partition 0 highwater is None
For partition 1 highwater is None
For partition 2 highwater is None
For partition 3 highwater is None
For partition 4 highwater is None
For partition 5 highwater is None
....
For partition 96 highwater is None
For partition 97 highwater is None
For partition 98 highwater is None
For partition 99 highwater is None
Subscription = None
con.seek_to_beginning() = None
con.seek_to_end() = None
assign
を使用する別のアプローチがありますが、結果は同じです
con = KafkaConsumer(bootstrap_servers = brokers)
ps = [TopicPartition(topic, p) for p in con.partitions_for_topic(topic)]
con.assign(ps)
for p in ps:
print "For partition %s highwater is %s"%(p.partition,con.highwater(p))
print "Subscription = %s"%con.subscription()
print "con.seek_to_beginning() = %s"%con.seek_to_beginning()
print "con.seek_to_end() = %s"%con.seek_to_end()
いくつかのドキュメントから、fetch
が発行されていない場合にこの動作が発生する可能性があるようです。しかし、私はそれを強制する方法を見つけることができません。私は何を間違えていますか?
または、トピックの最新のオフセットを取得するための異なる/簡単な方法はありますか?
最後にこれに1日を費やし、いくつかの間違ったスタートを切った後、解決策を見つけて機能させることができました。他の人が参照できるように彼女に投稿します。
from kafka import SimpleClient
from kafka.protocol.offset import OffsetRequest, OffsetResetStrategy
from kafka.common import OffsetRequestPayload
client = SimpleClient(brokers)
partitions = client.topic_partitions[topic]
offset_requests = [OffsetRequestPayload(topic, p, -1, 1) for p in partitions.keys()]
offsets_responses = client.send_offset_request(offset_requests)
for r in offsets_responses:
print "partition = %s, offset = %s"%(r.partition, r.offsets[0])
Kafka kafka/binにあるシェルスクリプトを使用する場合は、kafka-run-class.shを使用して最新の最小のオフセットを取得できます。
最新のオフセットコマンドを取得するには、次のようになります。
bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list localhost:9092 --time -1 --topic topiname
最小のオフセットコマンドを取得するには、次のようになります。
bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list localhost:9092 --time -2 --topic topiname
Get Offsets Shellの詳細については、次の link をご覧ください。
お役に立てれば!
from kafka import KafkaConsumer, TopicPartition
TOPIC = 'MYTOPIC'
GROUP = 'MYGROUP'
BOOTSTRAP_SERVERS = ['kafka01:9092', 'kafka02:9092']
consumer = KafkaConsumer(
bootstrap_servers=BOOTSTRAP_SERVERS,
group_id=GROUP,
enable_auto_commit=False
)
for p in consumer.partitions_for_topic(TOPIC):
tp = TopicPartition(TOPIC, p)
consumer.assign([tp])
committed = consumer.committed(tp)
consumer.seek_to_end(tp)
last_offset = consumer.position(tp)
print("topic: %s partition: %s committed: %s last: %s lag: %s" % (TOPIC, p, committed, last_offset, (last_offset - committed)))
consumer.close(autocommit=False)
kafka-python>=1.3.4
次を使用できます。
kafka.KafkaConsumer.end_offsets(partitions)
指定されたパーティションの最後のオフセットを取得します。パーティションの最後のオフセットは、今後のメッセージのオフセット、つまり、利用可能な最後のメッセージのオフセット+ 1です。
from kafka import TopicPartition
from kafka.consumer import KafkaConsumer
con = KafkaConsumer(bootstrap_servers = brokers)
ps = [TopicPartition(topic, p) for p in con.partitions_for_topic(topic)]
con.end_offsets(ps)
これを実現する別の方法は、コンシューマをポーリングして最後に消費されたオフセットを取得し、seek_to_endメソッドを使用して最新の利用可能なオフセットパーティションを取得することです。
from kafka import KafkaConsumer
consumer = KafkaConsumer('my-topic',
group_id='my-group',
bootstrap_servers=['localhost:9092'])
consumer.poll()
consumer.seek_to_end()
この方法は、消費者グループを使用する場合に特に役立ちます。
ソース: