现在的需求是想使用Python来解析数据,然后将数据载入到HBase数据库中。所以想使用Python操作HBase的话,就必须使用thrift网关。所以我的第一步就是先了解一下thrift网关是个什么东西。
以下的东西基本上来自网上的资料。
Thrift是一个软件框架,用来进行可扩展的且跨语言的服务开发,他结合了功能强大的 软件duizhan和代码生成引擎,用来构建在多种编程语言之间的高效的无缝的服务。
目前流行的服务调用方式有很多种,例如基于SOAP消息格式的WEB SERVICE和基于JSON格式的RESTful服务。其中所用到的数据传输方式包括XML和JSON,但是XML相对体积较大,传输效率比较低。JSON体积小,新颖,但是还是不够完善。Thrift是FB开发的远程服务调用框架,采用接口描述定义语言并创建服务,传输的数据采用二进制的格式,数据量更小,对于高并发,大叔据量和跨语言的环境更有优势。
通过Python使用HBase Thrift网关
HBase随机预装连描述服务层和对象集合的Thrift IDL。HBase也提供了实现接口的服务。下边将生成Thrift客户端库来访问HBase。使用客户端库通过Python访问HBase,这种方式完全脱离Java和JVM。
但是这样的网关面临和REST一样的吞吐量挑战。所有客户端链接就像漏斗一样通过和HBase集群通信的单台机器。
下面的内容基本上是基于HBase in action这本书上的操作。
一 .生成python语言的HBase Thrift客户端
1.先安装Thrift
mac里边可以直接通过homebrew安装:brew install thrift
但是在Ubuntu里,需要自己编译:
首先安装好thrift需要的其他库
sudo apt-get install libboost-dev libboost-test-dev libboost-program-options-dev libevent-dev automake libtool flex bison pkg-config g++ libssl-dev
然后下载thrift的tar包,解压到制定的路径,参照http://thrift.apache.org/docs/BuildingFromSource/
./configure之后make的时候会出现下边的错误:
ar: .libs/ThriftTest_constants.o: No such file or directory
根据网上的信息,在./configure时候取消对C++的支持,即: ./configure -with-cpp=no 然后在make和make install。这里我基本上安装之后只支持Python语言,如果后续需要其他方面的使用的话,估计得重新编译安装。
验证thrift是不是能够正常工作: thrift -version
2.创建一个自己的工程目录 mkdir ****/modis.py(以后的****均表示我自己的某个目录路径)
生成HBase客户端
cd modis.py
thrift -gen py ****/hbase-0.94.11/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift
mv gen-py/* .
rm -r gen-py/
在上面的步骤里我创建了一个叫做modis.py的项目,然后生成了HBase Python库。Thrift在gen-py子目录里生成连他的代码,吧这些文件移动到项目里,生成的文件如下:
# find .
.
./hbase
./hbase/Hbase.py
./hbase/ttypes.py
./hbase/__init__.py
./hbase/Hbase-remote
./hbase/constants.py
./__init__.py
3.安装Thrift Python库,这是通过python使用的所有thrift服务的核心组见。可以全局性的安装
sudo easy_install thrift==0.9.1
这个库也是编译的源代码的一部分,所以可以像处理HBase客户端的方法将其拷贝到工程的目录下:
mkdir thrift
cp -r /usr/lib/python2.7/site-packages/thrift/* ./thrift/
验证:
在本目录下打开python客户端import hbase和import thrift都成功。
二.启动HBase Thrift服务
Thrift的服务器组建已经和HBase一起预先安装连,所以没有上边的客户端的生成步骤,直接启动就可以。启动之前确保HBase是正常运作的。
hbase thrift start
这个开启之后不是后台进程,所以一直都是开着的,你需要另外启动一个终端来做后面的测试。
在我们的项目目录下启动Python,测试下面的内容,最后返回的是HBase数据库中的所有数据表的名称。
>>> from thrift.transport import TSocket
>>> from thrift.protocol import TBinaryProtocol
>>> from hbase import Hbase
>>> transport=TSocket.TSocket('localhost',9090)
>>> protocol=TBinaryProtocol.TBinaryProtocol(transport)
>>> client=Hbase.Client(protocol)
>>> transport.open()
>>> client.getTableNames()
['test']
到这里的所有一切都正常工作了!
|