可以在控制台中使用Kafka消息,但不能使用Python库?

可以在控制台中使用Kafka消息,但不能使用Python库?,python,linux,apache-kafka,message-queue,kafka-consumer-api,Python,Linux,Apache Kafka,Message Queue,Kafka Consumer Api,我在笔记本电脑上做本地工作,并试图从远程服务器“xxxxx”读取主题“测试”。 使用控制台时,我启动zookeeper、Kafka,然后启动消费者: bin/zookeeper-server-start.sh config/zookeeper.properties bin/kafka-server-start.sh config/server.properties bin/kafka-console-consumer.sh --bootstrap-server xxxxx:9092 --topi

我在笔记本电脑上做本地工作,并试图从远程服务器“xxxxx”读取主题“测试”。 使用控制台时,我启动zookeeper、Kafka,然后启动消费者:

bin/zookeeper-server-start.sh config/zookeeper.properties
bin/kafka-server-start.sh config/server.properties
bin/kafka-console-consumer.sh --bootstrap-server xxxxx:9092 --topic test --from-beginning
信息将显示在控制台中。 但在如下使用Python库时,我什么也看不到:

from kafka import KafkaConsumer

server = {'server': 'xxxxx:9092', 'topic': 'test'}

# To consume latest messages and auto-commit offsets
consumer = KafkaConsumer(server['topic'],
                         group_id='my-group',
                         bootstrap_servers=server['server'])

for message in consumer:
    # message value and key are raw bytes -- decode if necessary!
    # e.g., for unicode: `message.value.decode('utf-8')`
    print("%s:%d:%d: key=%s value=%s" % (message.topic, message.partition,
                                         message.offset, message.key,
                                         message.value))
我还可以成功地将本地消息从控制台中的Kafka发送到Python Kafka使用者,该问题仅在尝试使用远程消息时发生。
此外,与远程服务器的连接似乎建立得很好(它可以看到我),但不幸的是没有收到任何消息。

我找到的解决方案是使用另一个库,Confluent Kafka Python,该库只需配置服务器IP和要听的主题的名称,即可立即运行

编辑:以下是我实施的解决方案:

我以为Avro库只是读取Avro文件,但它实际上解决了解码卡夫卡消息的问题,如下所示:我首先导入库并将模式文件作为参数,然后创建一个函数将消息解码到字典中,我可以在消费者循环中使用

from confluent_kafka import Consumer, KafkaError
from avro.io import DatumReader, BinaryDecoder
import avro.schema

schema = avro.schema.Parse(open("data_sources/EventRecord.avsc").read())
reader = DatumReader(schema)

def decode(msg_value):
    message_bytes = io.BytesIO(msg_value)
    decoder = BinaryDecoder(message_bytes)
    event_dict = reader.read(decoder)
    return event_dict

c = Consumer()
c.subscribe(topic)
running = True
while running:
    msg = c.poll()
    if not msg.error():
        msg_value = msg.value()
        event_dict = decode(msg_value)
        print(event_dict)
    elif msg.error().code() != KafkaError._PARTITION_EOF:
        print(msg.error())
        running = False