【hbase】使用thrift with python 访问HBase

HBase 版本: 0.98.6

thrift   版本: 0.9.0

使用 thrift client with python 连接 HBase 报错:

 1 Traceback (most recent call last):
 2   File "D:\workspace\Python\py\helloworld.py", line 27, in <module>
 3     tables = client.getTableNames()
 4   File "E:\mazhongsoft\python\lib\hbase\Hbase.py", line 788, in getTableNames
 5     return self.recv_getTableNames()
 6   File "E:\mazhongsoft\python\lib\hbase\Hbase.py", line 798, in recv_getTableNames
 7     (fname, mtype, rseqid) = self._iprot.readMessageBegin()
 8   File "E:\mazhongsoft\python\lib\thrift\protocol\TBinaryProtocol.py", line 126, in readMessageBegin
 9     sz = self.readI32()
10   File "E:\mazhongsoft\python\lib\thrift\protocol\TBinaryProtocol.py", line 203, in readI32
11     buff = self.trans.readAll(4)
12   File "E:\mazhongsoft\python\lib\thrift\transport\TTransport.py", line 58, in readAll
13     chunk = self.read(sz-have)
14   File "E:\mazhongsoft\python\lib\thrift\transport\TTransport.py", line 155, in read
15     self.__rbuf = StringIO(self.__trans.read(max(sz, self.DEFAULT_BUFFER)))
16   File "E:\mazhongsoft\python\lib\thrift\transport\TSocket.py", line 94, in read
17     raise TTransportException(‘TSocket read 0 bytes‘)
18 thrift.transport.TTransport.TTransportException: None

查找原因,过程如下:
1) 客户端代码

1 transport = TTransport.TBufferedTransport(TSocket(‘192.168.0.10‘, 9090))
2 protocol = TBinaryProtocol.TBinaryProtocol(transport)
3 client = Hbase.Client(protocol)
4 transport.open()

2) hbase-site.xml 配置如下

1   <property>
2      <name>hbase.regionserver.thrift.framed</name>
3      <value>true</value>
4   </property>
5   <property>
6      <name>hbase.regionserver.thrift.compact</name>
7      <value>true</value>
8   </property>

3) thrift server日志如下:(/var/log/hbase/hbase-hbase-thrift-<hostname>.log)

 1 Wed Jan 14 14:54:43 CST 2015 Starting thrift on <hostname>
 2 core file size          (blocks, -c) 0
 3 data seg size           (kbytes, -d) unlimited
 4 scheduling priority             (-e) 0
 5 file size               (blocks, -f) unlimited
 6 pending signals                 (-i) 191956
 7 max locked memory       (kbytes, -l) unlimited
 8 max memory size         (kbytes, -m) unlimited
 9 open files                      (-n) 32768
10 pipe size            (512 bytes, -p) 8
11 POSIX message queues     (bytes, -q) 819200
12 real-time priority              (-r) 0
13 stack size              (kbytes, -s) 10240
14 cpu time               (seconds, -t) unlimited
15 max user processes              (-u) 1024
16 virtual memory          (kbytes, -v) unlimited
17 file locks                      (-x) unlimited
18 INFO  [main] util.VersionInfo: HBase 0.98.6-cdh5.3.0
19 INFO  [main] util.VersionInfo: Subversion file:///data/jenkins/workspace/generic-package-rhel64-6-0/topdir/BUILD/hbase-0.98.6-cdh5.3.0 -r Unknown
20 INFO  [main] util.VersionInfo: Compiled by jenkins on Tue Dec 16 19:13:29 PST 2014
21 INFO  [main] thrift.ThriftServerRunner: Using default thrift server type
22 INFO  [main] thrift.ThriftServerRunner: Using thrift server type threadpool
23 INFO  [main] impl.MetricsConfig: loaded properties from hadoop-metrics2-hbase.properties
24 INFO  [main] impl.MetricsSystemImpl: Scheduled snapshot period at 10 second(s).
25 INFO  [main] impl.MetricsSystemImpl: HBase metrics system started
26 INFO  [main] mortbay.log: Logging to org.slf4j.impl.Log4jLoggerAdapter(org.mortbay.log) via org.mortbay.log.Slf4jLog
27 INFO  [main] http.HttpServer: Added global filter ‘safety‘ (class=org.apache.hadoop.http.HttpServer$QuotingInputFilter)
28 INFO  [main] http.HttpServer: Added filter static_user_filter (class=org.apache.hadoop.http.lib.StaticUserWebFilter$StaticUserFilter) to context thrift
29 INFO  [main] http.HttpServer: Added filter static_user_filter (class=org.apache.hadoop.http.lib.StaticUserWebFilter$StaticUserFilter) to context static
30 INFO  [main] http.HttpServer: Jetty bound to port 9095
31 INFO  [main] mortbay.log: jetty-6.1.26.cloudera.4
32 INFO  [main] mortbay.log: Started [email protected]:9095
33 DEBUG [main] thrift.ThriftServerRunner: Using compact protocol
34 DEBUG [main] thrift.ThriftServerRunner: Using framed transport
35 INFO  [main] thrift.ThriftServerRunner: starting TBoundedThreadPoolServer on /0.0.0.0:9090; min worker threads=16, max worker threads=1000, max queued requests=1000

由以上红色文字部分可知,是因为thrift 的server端和client端的协议不匹配造成的。

解决方案有如下两个:
方案一:修改hbase-site.xml,禁用TFramedTransport和TCompactProtocol功能,即:

1   <property>
2      <name>hbase.regionserver.thrift.framed</name>
3      <value>false</value>
4   </property>
5   <property>
6      <name>hbase.regionserver.thrift.compact</name>
7      <value>false</value>
8   </property>

重启thrift 服务器: service hbase-thrift restart

方案二:修改客户端代码

1 transport = TFramedTransport(TSocket(‘192.168.0.10‘, 9090))
2 protocol = TCompactProtocol.TCompactProtocol(transport)
3 client = Hbase.Client(protocol)
4 transport.open()  

如果报错未找到TFramedTransport和TCompactProtocol,请查看/usr/lib/python2.6/site-packages/thrift目录下有没有protocol/TCompactProtocol.py文件,检查transport/TTransport.py文件中有没有类TFramedTransport。如果没有,可以在thrift官网下载源码包 thrift-0.9.2.tar.gz,用其中的lib/py/src/覆盖/usr/lib/python2.6/site-packages/thrift/目录即可。

时间: 2024-10-30 14:25:21

【hbase】使用thrift with python 访问HBase的相关文章

利用python访问Hbase(Thrift模块安装与测试)

hadoop环境介绍: master服务:node1 slave服务器:node2,node3,node4 mysql服务器:node29 Thrift安装在node1服务器上! 相关软件版本: hadoop版本:hadoop-0.20.2 sqoop版本:sqoop-1.2.0-CDH3B4 java版本:jdk1.7.0_67 mysql版本:5.1.65 Thrift版本:thrift-0.9.0 thrift安装链接:http://thrift.apache.org/download/

使用C#和Thrift来访问Hbase实例

1.开启Hbase的Thrift服务 在Hbase的master上运行:hbase-daemon.sh start thrift -threadpool 1.下载Thrift 0.7.0的源码和代码生成工具(姑且这么叫) 从上面提供的Thrift下载页面中的目录里分别下载代码生成工具: thrift-0.7.0.exe 和Thrift源代码: thrift-0.7.0.tar.gz 2.编译Thrift 用VS2012新建一个解决方案,然后再在解决方案中新建一个类库的项目,我起名叫thrift-

Python 操作 HBase —— Trift Trift2 Happybase 安装使用

Python无法直接访问HBase,必须通过Thrift. HBase与Thrift之间又支持两种接口标准,两种标准互不兼容,功能也互不覆盖. Thrift连接HBase还有超时自动断开的大坑. 安装Thrift依赖(Server端) Centos: yum install automake libtool flex bison pkgconfig gcc-c++ boost-devel libevent-devel zlib-devel python-devel ruby-devel open

利用Python调用HBASE

利用Python调用HBASE的 需要安装thrift hbase-thrift 启动hbase的thrift服务:bin/hbase-daemon.sh start thrift 默认端口是9090 mysql 到hbase的数据同步: 1.put 2.Importtsv 3.编写MapReduce Job导入 4.sqoop 简单code: #!/usr/bin/env python #coding=utf-8 import sys sys.path.append('/usr/lib/pyt

PHP通过thrift2访问HBASE

前一段时间需要在网页上显示HBASE查询的结果,考虑用PHP来实现,在网上搜了一下,普遍都是用thrift作为接口来实现的.? 参考博文:? http://www.cnblogs.com/scotoma/archive/2013/05/16/3081236.html 用上述网址里提供的PHP代码,可以访问公司里的一个HBASE集群,但是另一个集群怎么也访问不了,上网查了一下,发现thrift有两套HBASE的接口--thrift和thrift2,而且两套接口并不兼容. ? 用thrift2的接口

Hadoop Hive与Hbase整合+thrift

1.  简介 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进行运行. 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析. Hive与HBase的整合功能的实现是利用两者本身对外的API接口互相进行通信,相互通信主要是依靠hive_hbase-handler.jar工具类, 大致意思如图所示

python操作Hbase

本地操作 启动thrift服务:./bin/hbase-daemon.sh start thrift hbase模块产生: 下载thrfit源码包:thrift-0.8.0.tar.gz 解压安装 ./configure make make install 在thrift-0.8.0目录中,lib/py/build/lib.linux-x86_64-2.6/目录下存在thrift的python模块,拷贝出来即可 生成hbase模块 下载源码包:hbase-0.98.24-src.tar.gz 解

HBase(二): c#访问HBase之股票行情Demo

上一章完成了c#访问hbase的sdk封装,接下来以一个具体Demo对sdk进行测试验证.场景:每5秒抓取指定股票列表的实时价格波动行情,数据下载后,一方面实时刷新UI界面,另一方面将数据放入到在内存中模拟的MQ (实际生产情况,可用kafka等集群代替)->存入HBase数据库.提供按指定时间范围股票价格数据查询. 目录: 示例说明 示例效果图 rest server运行状态检查 获取股票实时数据代码 数据持续化至Hbase代码 从HBase读取数据代码 示例说明: 在Hbase 中创建两个表

Java访问Hbase

1.kerberos验证 a.下载对应版本JCE(Java Cryptography Extension),解压拷贝local_policy.jar/US_export_policy.jar到$JAVA_HOME//jre/lib/security b.在resource即classes路径下添加hbase-site.xml <configuration> <!-- 访问的hbase集群的名字 --> <property> <name>hbase.clust