Confluent Kafka 5.0.0已安装在具有公共IP(例如54.XX.XX.XX)的AWS EC2上 在EC2机器上使用0.0.0.0打开端口9092
在/etc/kafka/server.properties中,我拥有
advertised.listeners=PLAINTEXT://54.XX.XX.XX:9092
listeners=PLAINTEXT://0.0.0.0:9092
在/etc/kafka/producer.properties
中,我有bootstrap.servers=0.0.0.0:9092
在本地计算机上
在/etc/kafka/consumer.properties
中,我有bootstrap.servers=54.XX.XX.XX:9092
在EC2中,启动kafka 'confluent start'
并创建“ mytopic”
从本地计算机运行的我的producer.py代码看起来像(相关部分):
from confluent_kafka import Producer
broker = '54.XX.XX.XX'
topic = 'mytopic'
p = Producer({'bootstrap.servers': broker})
for data in dictList:
p.poll(0)
sendme = json.dumps(data)
p.produce(topic, sendme.encode('utf-8'), callback=delivery_report)
p.flush()
这似乎将消息写入EC2中kafka流中的“ mytopic”。我可以在EC2的“ kafkacat -b 54.XX.XX.XX -t mytopic”中看到这些消息。
但是我不能作为简单的消息打印使用者从本地计算机访问这些消息,其代码如下:
from confluent_kafka import Consumer, KafkaError, KafkaException
import json
import sys
broker = '54.XX.XX.XX'
topic = 'mytopic'
group = 'mygroup'
c = Consumer({
'bootstrap.servers': broker,
'group.id': group,
'session.timeout.ms': 6000,
'default.topic.config': {
'auto.offset.reset': 'smallest'
}
})
basic_consume_loop(c,[topic])
def basic_consume_loop(consumer, topics):
try:
consumer.subscribe(topics)
while running:
msg = consumer.poll(timeout=1.0)
if msg is None: continue
if msg.error():
if msg.error().code() == KafkaError._PARTITION_EOF:
# End of partition event
sys.stderr.write('{} [{}] reached end at offset {}\n'.format(msg.topic(), msg.partition(), msg.offset()))
data_process()
elif msg.error():
raise KafkaException(msg.error())
else:
msg_process(msg)
finally:
# Close down consumer to commit final offsets.
print("Shutting down the consumer")
consumer.close()
它只是挂起,我错过任何设置了吗?
答案 0 :(得分:0)
以下步骤似乎可行。
在本地和EC2计算机上,都在/etc/kakfa/server.properties中设置
listeners=PLAINTEXT://0.0.0.0:9092
advertised.listeners=PLAINTEXT://54.XX.XX.XX:9092
在本地计算机上的/etc/kakfa/producer.properties中设置
bootstrap.servers=0.0.0.0:9092
在EC2计算机上,在/etc/kakfa/producer.properties中设置
bootstrap.servers=localhost:9092
在本地和EC2计算机上,在/etc/kakfa/consumer.properties中设置
bootstrap.servers=0.0.0.0:9092
group.id=mygroup
使用'confluent-start'在远程EC2计算机上启动所有必需的守护程序。 在本地计算机上,Confluent没有运行。
在本地计算机上(用于IP隐藏,可选):
export KAFKA_PRODUCER_IP=54.XX.XX.XX
有了这个,本地机器的生产者可以通过以下方式将消息放在远程EC2 Kafka上:
broker = os.environ['KAFKA_PRODUCER_IP'] + ':9092'
topic = 'mytopic'
p = Producer({'bootstrap.servers': broker})
可以从本地计算机通过以下操作从远程EC2 kafka提取消息:
broker = os.environ['KAFKA_PRODUCER_IP'] + ':9092'
topic = 'mytopic'
group = 'mygroup'
c = Consumer({
'bootstrap.servers': broker,
'group.id': group,
'session.timeout.ms': 6000,
'default.topic.config': {
'auto.offset.reset': 'smallest'
}
})
这些步骤似乎有效。请指出,可能会有一些冗余。