使用python连接到Hbase失败

时间:2017-04-18 13:22:02

标签: python hadoop hbase happybase

我正在尝试使用python连接到Hbase 使用的示例代码

import happybase
connection = happybase.Connection(myhost,port, autoconnect=True)

# before first use:
connection.open()
print(connection.tables())

给出错误如下

  
    
      

打印(connection.tables())       Traceback(最近一次调用最后一次):         文件"",第1行,in         文件" /usr/local/lib/python2.7/dist-packages/happybase/connection.py" ;,第242行,在表格中           names = self.client.getTableNames()         文件" /usr/local/lib/python2.7/dist-packages/thriftpy/thrift.py" ;,第198行,在_req中           return self._recv(_api)         文件" /usr/local/lib/python2.7/dist-packages/thriftpy/thrift.py" ;,第210行,在_recv中           fname,mtype,rseqid = self._iprot.read_message_begin()         文件" thriftpy / protocol / cybin / cybin.pyx",第439行,在cybin.TCyBinaryProtocol.read_message_begin(thriftpy / protocol / cybin / cybin.c:6470)       cybin.ProtocolError:没有协议版本标题

    
  
操作系统:Ubuntu 16.04 我正在使用python 2.7 Hbase版本1.1 帮助我理解这个问题。除了happybase之外,还有更好的方法可以连接到Hbase

由于

2 个答案:

答案 0 :(得分:2)

感谢您提出这个问题,我确实陷入了同样的问题,互联网上没有答案。我们不确定是否是唯一能够达到此目的的人。

但这是我如何解决问题,从错误中明确表示与thrift有关,所以请检查以下内容

/usr/hdp/current/hbase-master/bin/hbase-daemon.sh start thrift

如果节俭没有运行!你可能需要开始节俭

/usr/hdp/current/hbase-master/bin/hbase-daemon.sh start thrift -p 9090 --infoport 9091

然后尝试你的代码。

import happybase

c = happybase.Connection('127.0.0.1',9090, autoconnect=False)
c.open()
print(c.tables())

自动连接到hbase

import happybase

c = happybase.Connection('127.0.0.1',9090)
print(c.tables())

作为替代方案,您可以使用 starbase 但它不再活跃我相信您需要启动rest API。 /usr/hdp/current/hbase-master/bin/hbase-daemon.sh start rest -p 8000 --inforport 8001 试试happybase,如果您遇到同样的问题,请告诉我们。

BTW我的测试是在HDP2.5上进行的

进一步参考: https://github.com/wbolster/happybase/issues/161

除非你知道自己在做什么,否则我不建议

从hbase-site.xml [/etc/hbase/conf/hbase-site.xml]中删除以下属性:

<property>
  <name>hbase.regionserver.thrift.http</name>
  <value>true</value>
</property>
<property>
  <name>hbase.thrift.support.proxyuser</name>
  <value>true/value>
</property>

希望这有帮助,
AMOD

答案 1 :(得分:0)

您执行autoconnect = True或使用connection.open()明确启动它。你不必一起做这两件事。