远程连接 kafka 配置
默认的 kafka 配置是无法远程访问的,解决该问题有几个方案。
方案1
advertised.listeners=PLAINTEXT://IP:9092
注意必须是 ip,不能是 hostname
方案2
advertised.listeners=PLAINTEXT://node0:9092
node0 是 hostname,需在 /etc/hosts 中 添加一行
172.16.89.80 node0
然后 必须在 远程机(要访问 kafka 的机器 windows)上修改 hosts文件,
C:\Windows\System32\drivers\etc\hosts
在末尾加上
IP1 节点1
IP2 节点2
节点名与服务器上的 hostname 相同。
测试异常记录
WARN [Consumer clientId=consumer-1, groupId=console-consumer-4184] Connection to node -1 (/172.16.89.80:9092) could not be established. Broker may not be available . (org.apache.kafka.clients.NetworkClient)
kafka 配置 与 console 启动的 ip 不一致,如 配置文件中 listeners=PLAINTEXT://172.16.89.80:9092,启动 是 localhost
kafka.errors.NoBrokersAvailable: NoBrokersAvailable
listeners=PLAINTEXT://172.16.89.80:9092
基础操作
最简单的场景,生产者发送,消费者接收
Producer
send(self, topic, value=None, key=None, headers=None, partition=None, timestamp_ms=None)
producer = KafkaProducer(bootstrap_servers = '172.16.89.80:9092') # producer = KafkaProducer(bootstrap_servers = 'node0:9092') # 如果这里是 ip,后面必须加 producer.flush() 或者 producer.close(); # 如果是 hostname,则不需要,但是好像有丢包 print(producer.config) # 打印配置信息 topic = '91202' for i in range(200): msg = "msg%d" % i producer.send(topic, msg) producer.flush() # producer.close()
上面的注释是我亲测的结果,至于为什么,我还没明白,谁能帮我解答
Consumer
topic = '91202' consumer = KafkaConsumer(topic, bootstrap_servers=['172.16.89.80:9092']) # consumer是一个消息队列,当后台有消息时,这个消息队列就会自动增加.所以遍历也总是会有数据,当消息队列中没有数据时,就会堵塞等待消息带来 for msg in consumer: recv = "%s:%d:%d: key=%s value=%s" % (msg.topic, msg.partition, msg.offset, msg.key, msg.value) print recv time.sleep(2)
注意 这种消费方式只能消费实时数据,不能消费历史数据
如果想读历史消息,可以这样写
consumer = KafkaConsumer(topic, auto_offset_reset='earliest', bootstrap_servers=['172.16.89.80:9092'])
auto_offset_reset:重置 offset,earliest 表示移到最早的可用消息,