获取从python KafkaProducer发送的消息

时间:2017-07-08 21:18:34

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

我的目标是从非文件来源获取数据(即在程序中生成或通过API发送)并将其发送到火花流。为此,我通过python-based KafkaProducer发送数据:

$ bin/zookeeper-server-start.sh config/zookeeper.properties &
$ bin/kafka-server-start.sh config/server.properties &
$ bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic my-topic
$ python 
Python 3.6.1| Anaconda custom (64-bit)
> from kafka import KafkaProducer
> import time
> producer = KafkaProducer(bootstrap_servers='localhost:9092', value_serializer=lambda v: json.dumps(v).encode('utf-8'))
> producer.send(topic = 'my-topic', value = 'MESSAGE ACKNOWLEDGED', timestamp_ms = time.time())
> producer.close()
> exit()

我的问题是从使用者shell脚本检查主题时没有出现任何内容:

$ bin/kafka-console-consumer.sh --bootstrap-server localhost:2181 --topic my-topic
^C$

这里有什么遗漏或错误吗?我是spark / kafka /消息系统的新手,所以一切都会有所帮助。 Kafka版本为0.11.0.0(Scala 2.11),并且未对配置文件进行任何更改。

2 个答案:

答案 0 :(得分:1)

如果您在向主题发送消息后启动消费者,则消费者可能会跳过该消息,因为它会设置主题偏移(可以将其视为"起点"来读取从)到主题的结束。要更改该行为,请尝试添加--from-beginning选项:

$ bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic my-topic --from-beginning

此外,您可以尝试kafkacat,这比Kafka的控制台消费者和制作人(imho)更方便。使用kafkacat从Kafka读取消息可以使用以下命令执行:

kafkacat -C -b 'localhost:9092' -o beginning -e -D '\n' -t 'my-topic'

希望它会有所帮助。

答案 1 :(得分:0)

我发现了这个问题,value_serializer默默地崩溃了,因为我没有将json模块导入解释器。两个解决方案,一个是简单地导入模块,然后你将获得"MESSAGE ACKNOWLEDGED"(带引号)。或者您可以完全删除value_serializer并将下一行中发送的value字符串转换为字节字符串(即Python 3的b'MESSAGE ACKNOWLEDGED'),这样您就可以收到消息引号。

我还将Kafka改为版本0.10.2.1(Scala 2.11),因为Kafka-python文档中没有确认它与版本0.11.0.0兼容