AFAIK,
引入了kafka中分区和(消费者)组的概念来实现并行性。我正在通过python与kafka合作。我有一个特定的主题,它有(比如说)2个分区。这意味着,如果我启动一个包含2个消费者的消费者群体,他们将被映射(订阅)到不同的分区。
但是,在python中使用kafka
库时,我遇到了一个奇怪的问题。我开始使用基本相同的group-id的2个消费者,并启动线程让他们使用消息。
但是,kafka-stream中的每条消息都被他们两个消费了!!这对我来说似乎很荒谬,甚至在概念上也是不正确的。无论如何我可以手动将消费者映射到某些(不同的)分区(如果它们没有自动映射到不同的分区)?
以下是代码:
from kafka import KafkaConsumer
import thread
def con1(consumer):
for msg in consumer:
print msg
consumer1 = KafkaConsumer('k-test', group_id='grp1', bootstrap_servers=['10.50.23.120:9092'])
consumer2 = KafkaConsumer('k-test', group_id='grp1', bootstrap_servers=['10.50.23.120:9092'])
thread.start_new_thread(con1, (consumer1,))
thread.start_new_thread(con1, (consumer2,))
以下是我使用kafka-console-producer生成的一些消息的输出:
ConsumerRecord(topic=u'k-test', partition=0, offset=47, timestamp=None, timestamp_type=None, key=None, value='polki')
ConsumerRecord(topic=u'k-test', partition=0, offset=47, timestamp=None, timestamp_type=None, key=None, value='polki')
ConsumerRecord(topic=u'k-test', partition=0, offset=48, timestamp=None, timestamp_type=None, key=None, value='qwewrg')
ConsumerRecord(topic=u'k-test', partition=0, offset=48, timestamp=None, timestamp_type=None, key=None, value='qwewrg')
ConsumerRecord(topic=u'k-test', partition=0, offset=49, timestamp=None, timestamp_type=None, key=None, value='shgjas')
ConsumerRecord(topic=u'k-test', partition=0, offset=49, timestamp=None, timestamp_type=None, key=None, value='shgjas')
虽然预期是其中之一。顺便说一句,这个主题k-test
有2个分区。
答案 0 :(得分:0)
我猜你正在使用Kafka 0.8或更低版本,它不支持基于documents的此功能:
...但是,某些功能只会在较新的代理上启用;对于 例如,完全协调的消费者群体 - 即动态分区 分配给同一组中的多个消费者 - 需要使用 0.9+ kafka经纪人......
答案 1 :(得分:0)
from kafka import KafkaConsumer
from kafka import TopicPartition
TOPIC = "k-test"
PARTITION_0 = 0
PARTITION_1 = 1
consumer_0 = KafkaConsumer(
TOPIC, group_id='grp1', bootstrap_servers=['10.50.23.120:9092']
)
consumer_1 = KafkaConsumer(
TOPIC, group_id='grp1', bootstrap_servers=['10.50.23.120:9092']
)
topic_partition_0 = TopicPartition(TOPIC, PARTITION_0)
topic_partition_1 = TopicPartition(TOPIC, PARTITION_1)
# format: topic, partition
consumer_0.assign([topic_partition_0])
consumer_1.assign([topic_partition_1])
assign()可能对您有用,但一旦您使用它,当消费者停止工作时,kafka将不会自动平衡消费者。
答案 2 :(得分:0)
尝试运行bin / kafka-consumer-groups.sh命令行工具来验证您使用的Python Kafka客户端是否支持正确的使用者组管理。如果两个消费者确实在同一个组中,那么他们应该从互斥的分区获取消息。