【问题标题】:Connecting Kafka running on EC2 machine from my local machine从我的本地机器连接在 EC2 机器上运行的 Kafka
【发布时间】:2017-04-22 23:23:57
【问题描述】:

我是 Kafka 新手,在论坛中搜索了不同的帖子,但找不到解决方案。我已经在 EC2 实例上安装了 kafka,并尝试从我的 ubuntu 本地机器上连接它。我的目标是让 python kafka 客户端(生产者和消费者)在我的本地机器上运行,并通过 EC2 kafka 实例发送/接收数据。这可能吗?

在 server.properties 配置文件中设置的属性:

listeners=PLAINTEXT://0.0.0.0:9092 
advertised.listeners=PLAINTEXT://<ec2-public-DNS>:9092

在 Kafka EC2 实例上:

netstat -an | grep LISTEN 
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 
tcp6 0 0 :::9092 :::* LISTEN 

在 Kafka EC2 实例上的 Zookeeper cli 上:

get /brokers/ids/0
{"listener_security_protocol_map":{"PLAINTEXT":"PLAINTEXT"},"endpoints":["PLAINTEXT://<ec2-public-DNS>:9092"],"jmx_port":-1,"host":"<ec2-public-DNS>","timestamp":"1492900361516","port":9092,"version":4}
cZxid = 0xed
ctime = Sat Apr 22 22:32:41 UTC 2017
mZxid = 0xed
mtime = Sat Apr 22 22:32:41 UTC 2017
pZxid = 0xed
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x15b97cb9d060000
dataLength = 250
numChildren = 0

我本地机器上的 Python 客户端(生产者):

from kafka import KafkaProducer
import time
import json

producer = KafkaProducer(bootstrap_servers="<ec2-public-DNS>:9092")
for i in range(100):
    dict = {}
    dict['name_'+str(i)] = 'FILE_' + str(i)
    dict['size_'+str(i)] = '23.' + str(i)
    dict['host_'+str(i)] = '10.0.0.0' + str(i)
    jd = json.dumps(dict)
    producer.send('console-test-topic', jd)
    time.sleep(2)

我本地机器上的 Python 客户端(消费者):

from kafka import KafkaConsumer

consumer = KafkaConsumer('console-test-topic', bootstrap_servers="<ec2-public-DNS>:9092")
for msg in consumer:
    print (msg)

但是,生产者无法连接到 Kafka EC2 实例并且失败并出现以下错误:

**kafka.errors.NoBrokersAvailable: NoBrokersAvailable** 

我的安全组规则请参考链接:

goo.gl/ZUVknv

在我的本地机器上以调试模式运行 Producer:

DEBUG:kafka.producer.kafka:Starting the Kafka producer
DEBUG:kafka.metrics.metrics:Added sensor with name connections-closed
DEBUG:kafka.metrics.metrics:Added sensor with name connections-created
DEBUG:kafka.metrics.metrics:Added sensor with name select-time
DEBUG:kafka.metrics.metrics:Added sensor with name io-time
INFO:kafka.client:Bootstrapping cluster metadata from [('ec2-54-91-87-14.compute-1.amazonaws.com', 9092, 0)]
DEBUG:kafka.client:Attempting to bootstrap via node at ec2-54-91-87-14.compute-1.amazonaws.com:9092
DEBUG:kafka.metrics.metrics:Added sensor with name bytes-sent-received
DEBUG:kafka.metrics.metrics:Added sensor with name bytes-sent
DEBUG:kafka.metrics.metrics:Added sensor with name bytes-received
DEBUG:kafka.metrics.metrics:Added sensor with name request-latency
DEBUG:kafka.metrics.metrics:Added sensor with name node-bootstrap.bytes-sent
DEBUG:kafka.metrics.metrics:Added sensor with name node-bootstrap.bytes-received
DEBUG:kafka.metrics.metrics:Added sensor with name node-bootstrap.latency
DEBUG:kafka.client:Node bootstrap connected
DEBUG:kafka.cluster:Updated cluster metadata to ClusterMetadata(brokers: 1, topics: 2, groups: 0)
INFO:kafka.client:Bootstrap succeeded: found 1 brokers and 2 topics.
DEBUG:kafka.client:Initiating connection to node 0 at ec2-54-91-87-14.compute-1.amazonaws.com:9092
DEBUG:kafka.metrics.metrics:Added sensor with name node-0.bytes-sent
DEBUG:kafka.metrics.metrics:Added sensor with name node-0.bytes-received
DEBUG:kafka.metrics.metrics:Added sensor with name node-0.latency
INFO:kafka.producer.kafka:Kafka producer closed
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/kafka/producer/kafka.py", line 335, in __init__
    **self.config)
  File "/usr/local/lib/python2.7/dist-packages/kafka/client_async.py", line 210, in __init__
    self.config['api_version'] = self.check_version(timeout=check_timeout)
  File "/usr/local/lib/python2.7/dist-packages/kafka/client_async.py", line 828, in check_version
    raise Errors.NoBrokersAvailable()
kafka.errors.NoBrokersAvailable: NoBrokersAvailable

我尝试在另一个 EC2 实例中运行生产者客户端(在与 kafka 实例相同的 VPN 中),它工作正常。但是,当生产者在我的本地机器上运行时,它不起作用。 'advertised.listeners' 属性是否在同一个(AWS VPN)网络中宣传 kafka 经纪人?或者我也可以从我的本地机器连接它?如果有人能指出正确的方向,请告诉我。

【问题讨论】:

  • 是的,您尝试做的事情绝对是可能的。嗯,所以生产者无法联系 bootstrap_server/Kafka 代理。听起来像是 EC2 安全组问题;确保它至少对您客户的 IP 和 9092 开放,也许先执行 0.0.0.0:9092 ,然后在您开始工作后扣紧安全性。如果您确定并且您的 kafka 配置设置正确,我将重新启动 Kafka 服务。在使用 Kafka 时,我已经通过这样做解决了问题。如果这不起作用,请打开日志记录并粘贴输出:import logging; logging.basicConfig(level=logging.DEBUG)
  • 您好,我已经在上面添加了我的安全组规则和调试输出。是的,我已经尝试多次重启 kafka 服务器。如果您对此问题有任何线索,请告诉我。

标签: amazon-web-services amazon-ec2 apache-kafka kafka-producer-api kafka-python


【解决方案1】:

几个月前我经历了类似的情况,基本上我在弗吉尼亚北部有一个带有 Kafka 的 ec2 实例,我在本地机器上配置了 topbeat 以将指标发送到该 ec2 实例。 我能够通过添加

让它工作
advertised.host.name=public-ip

作为 kafka 的 server.properties 中的配置,但根据documentation,此属性已被弃用。

进一步阅读documentation,据说如果你在IaaS环境中,你必须配置与broker绑定的接口不同的advertised.listeners。

【讨论】:

    【解决方案2】:

    您是否疏忽了将 AWS 安全组中的入站端口 9092 打开到本地网络的外部 IP?如果您选择向所有人开放,请将其打开至0.0.0.0/0(但请注意安全隐患)。

    【讨论】:

    • 您好,我在上面添加了我的安全组规则。如果您对此问题有任何线索,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 2017-10-20
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    • 2018-12-13
    相关资源
    最近更新 更多