原理:
除了Java之外,最常见的访问HBase的方法是通过Thrift。Thrift是一种语言和一套生成代码的工具。Thrift是一种描 述对象和服务的界面定义语言(Interface Definition Language)。它提供了一种网络协议,使用这些对象和服务定义的进程之间基于这种网络协议彼此进行通信。Thrift根据你描述的界面定义语言生成 你喜欢的语言的代码。使用这种代码,你可以编写应用,通过Thrift提供的通用语言和其他应用系统进行通信。HBase随机预装了描述服 务层和对象集合的Thrift IDL。HBase也提供了实现接口的服务。本实验将生成Thrift客户端函数库,然后利用客户端函数库通过Python访问HBase,这种方式完全 脱离了Java和JVM。同样,可以通过其他语言使用同样的方式来访问HBase,如PHP,go。
软件版本:
hadoop2.2.0(参见 hadoop2.2.0测试环境搭建 )
hbase0.96.0 (参见 Hbase0.96.0 +hadoop2.2.0安装 )
实验环境:
hadoop1 192.168.100.171(hadoop master、secondaryname、zookeeper、hbase HMaster)
hadoop2 192.168.100.172(zookeeper、hbase HRegion、Hive Shell)
hadoop3 192.168.100.173(hadoop slave、zookeeper、hbase HRegion)
hadoop4 192.168.100.174(hadoop slave、zookeeper、hbase HRegion)
hadoop5 192.168.100.175(hadoop slave、zookeeper、hbase HRegion)
dataserver 192.168.100.141(Hive metastore、MySQL Server、Oracle)
准备工作:
本次测试在dataserver进行
下载thrift0.9.1至/mnt/mydisk/soft/program/thrift-0.9.1.tar.gz
下载hbase0.96.0源码至/mnt/mydisk/soft/hadoop/hbase/hbase-0.96.0-src.tar.gz
1:安装thrift0.9.1
[root@dataserver app]# sudo yum install automake libtool flex bison pkgconfig gcc-c++ boost-devel libevent-devel zlib-devel python-devel ruby-devel
[root@dataserver app]# tar zxf /mnt/mydisk/soft/program/thrift-0.9.1.tar.gz
[root@dataserver app]# cd thrift-0.9.1
[root@dataserver thrift-0.9.1]# ./configure
**************************************************************************************
注意安装thrift安装上要使用Python库,如果要使用其他语言就安装上相应的语言库
**************************************************************************************
[root@dataserver thrift-0.9.1]# make
**************************************************************************************
注意如果要编译C++库的话,会出现上面的错误,原因是编译文件路径有问题,可以将已经编译的test/cpp/*.o复制到test/cpp/.libs后,继续编译就可以了。当然不怕麻烦的话,可以修改一下编译文件。
[root@dataserver thrift-0.9.1] cd test/cpp
[root@dataserver cpp]# cp *.o .libs/
**************************************************************************************
[root@dataserver thrift-0.9.1]# make install
[root@dataserver thrift-0.9.1]# thrift --version
2:安装HBase源代码
[root@dataserver hbase]# cd /app/hadoop
[root@dataserver hadoop]# tar /mnt/mydisk/soft/hadoop/hbase/hbase-0.96.0-src.tar.gz
[root@dataserver hadoop]# mv hbase-0.96.0 hbase096_src
3:建立python项目目录以及使用的Hbase库和thrift库
[root@dataserver hadoop]# mkdir -p /app/myprom/python/hbase
[root@dataserver hadoop]# cd hbase096_src/hbase-thrift/src/main/resources/org/apache/hadoop/hbase/thrift
[root@dataserver thrift]# thrift -gen py Hbase.thrift
[root@dataserver thrift]# cd gen-py
[root@dataserver gen-py]# cp -r * /app/myprom/python/hbase/
[root@dataserver thrift]# cd /app
[root@dataserver app]# easy_install thrift==0.9.1
[root@dataserver thrift2]# cd /usr/lib64/python2.6/site-packages
[root@dataserver site-packages]# cp -r thrift /app/myprom/python/hbase/
[root@dataserver site-packages]# cd /app/myprom/python/hbase
这样,项目要使用的库建立好了
4:启动hadoop2.2.0、zookeeper3.4.5、HBase0.96.0
使用bin/hbase-deamon.sh start thrift 启动HBase thrift服务
5:编写python程序,使用thrift访问HBase0.96.0
编写程序前,先切换到python项目目录/app/myprom/python/hbase
[root@dataserver hbase]# python
>>> from thrift.transport import TSocket
>>> from thrift.protocol import TBinaryProtocol
>>> from hbase import Hbase
>>> transport=TSocket.TSocket("hadoop1",9090)
>>> protocol=TBinaryProtocol.TBinaryProtocol(transport)
>>> client=Hbase.Client(protocol)
>>> transport.open()
>>> client.getTableNames()
>>> client.getTableRegions("wordcount")
>>> client.getColumnDescriptors("wordcount")
6:TIPS
A:HBase0.96.0还提供了thrift2(app/hadoop/hbase096_src/hbase-thrift/src/main/resources/org/apache/hadoop/hbase/thrift2)接口,对HBase的操作有所变化,基本原理一样。下面是python代码:
>>> from thrift.transport import TSocket
>>> from thrift.protocol import TBinaryProtocol
>>> from hbase import THBaseService
>>> transport=TSocket.TSocket("hadoop1",9090)
>>> protocol=TBinaryProtocol.TBinaryProtocol(transport)
>>> client=THBaseService.Client(protocol)
>>> transport.open()