pykafka的NoBrokersAvailableError原因

今天在使用pykafka的时候遇到一个问题,我的kafka和zookeeper运行在一台机器上面,然后应用程序跑在另外一台机器上面。
当我调用pykafka中的KafkaClient(zookeeper_host='x.x.x.x:2181')的时候报出一个异常,显示如下:

  client       = KafkaClient(zookeeper_hosts = '%s:%s' % (conf.ZOOKEEPER_HOST, conf.ZOOKEEPER_PORT), broker_version = '0.10.1.0')
  File "/usr/local/lib/python2.7/dist-packages/pykafka-2.5.0-py2.7.egg/pykafka/client.py", line 137, in __init__
    broker_version=broker_version)
  File "/usr/local/lib/python2.7/dist-packages/pykafka-2.5.0-py2.7.egg/pykafka/cluster.py", line 205, in __init__
    self.update()
  File "/usr/local/lib/python2.7/dist-packages/pykafka-2.5.0-py2.7.egg/pykafka/cluster.py", line 427, in update
    metadata = self._get_metadata()
  File "/usr/local/lib/python2.7/dist-packages/pykafka-2.5.0-py2.7.egg/pykafka/cluster.py", line 287, in _get_metadata
    'Unable to connect to a broker to fetch metadata. See logs.')
NoBrokersAvailableError: Unable to connect to a broker to fetch metadata. See logs.

从上面的traceback来看大致是说没有找到可用的broker,也就是说没有可用的kafka服务。可是我明明是开启了kafka服务的,9092端口是开放的,这就有点奇怪了。
这个时候把NoBrokersAvailableError这个异常google了一下,网上说的大致原因可能是从zookeeper获取broker的meta信息时候返回的不是IP而是hostname。恩,我想了一下有可能,那么我就把kafka这台主机的IP hostname添加到应用程序的hosts里面再试试吧,结果还是同样的错误。
这个时候有点懵圈了,只好直接在代码里面调试一把看看了,根据上面的traceback在pykafka/cluster.py这个源文件的_get_metadata()函数中加入几个print打印一下到底返回的meta信息是啥吧,最后发现从zookeeper返回的broker的meta信息竟然是(‘localhost’, 9092),根本不是IP也不是主机的hostname。
到这个时候基本就可以确定肯定是我的config/server.properties默认参数导致的这个问题了,看了一下这个配置文件,发现有一个配置参数listeners表示kafka服务监听的地址,那么试着把这个改成listeners=PLAINTEXT://x.x.x.x:9092然后重启一下服务,接着重新运行应用程序就OK了。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值