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了。

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页