文章目录
  1. 1. 下载thrift
  2. 2. HBase thrift 接口
  3. 3. python代码,查询HBase数据
  4. 4. Thrift 函数默认参数的问题

下载thrift

开发环境是在windows下,apache thrift 提供了windows的预编译文件,直接下载即可。
使用如下命令由__*.thrift__文件生成python代码, 在子文件夹gen-py下, 在python代码中需要将该文件夹路径添加至sys.path

1
thrift --gen py <Thrift filename>

第一次使用thrift, 出现了个小乌龙,错将参数写成*–gen python*, 然后命令行出错,说无法找到generator python。 为这个错误还在网上搜索了老半天。

HBase thrift 接口

HBase文档中没有明确给出thift接口的使用方法, 使用搜索引擎才找到用法。

HBase thrift 接口有两个版本,称为thriftthrift2, 可以从HBase的源码包拿到,压缩包中相应的路径分别是 hbase-thrift/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrifthbase-thrift/src/main/resources/org/apache/hadoop/hbase/thrift2/hbase.thrift. 这里使用的是thrift2接口。

另外HBase thrift service 需要单独启动。 thrift和thrift2 使用相同的端口9090,默认配置下只能使用其中一种。

  • start/stop thrift:

    1
    2
    $HBASE_HOME/bin/hbase-daemon.sh start thrift
    $HBASE_HOME/bin/hbase-daemon.sh stop thrift
  • start/stop thrift2:

    1
    2
    $HBASE_HOME/bin/hbase-daemon.sh start thrift2
    $HBASE_HOME/bin/hbase-daemon.sh stop thrift2
  • 检查端口占用

    1
    netstat -nao | grep 9090

参考:

python代码,查询HBase数据

生成的python代码中client访问HBase使用类hbase.THBaseService.Client, 只支持数据操作,不能对表结构作查询或是变更。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/usr/bin/env python

import sys

sys.path.append('gen-py')

from thrift import Thrift
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol

from hbase import THBaseService
from hbase.ttypes import *

try:
transport = TSocket.TSocket('localhost', 9090)
transport = TTransport.TBufferedTransport(transport)
protocol = TBinaryProtocol.TBinaryProtocol(transport)

client = THBaseService.Client(protocol)
transport.open()

scannerId = None
try:
scannerId = client.openScanner('test', TScan())
rows = client.getScannerRows(scannerId, 1)
if rows:
for r in rows:
print r.row
for c in r.columnValues:
print '\t{}:{} - {}'.format(c.family, c.qualifier, c.value)
except Exception, e:
print e
finally:
if scannerId:
client.closeScanner(scannerId)

except Thrift.TException, tx:
print '%s' % (tx.message)

Thrift 函数默认参数的问题

hbase.thritgetScannerRows(scannerId, numRows)第二个参数numRows有指明默认值为1
但生成的python代码并没有默认参数。

hbase.thrift:
hbase.thrift

THBaseService.py:
THBaseService.py

文章目录
  1. 1. 下载thrift
  2. 2. HBase thrift 接口
  3. 3. python代码,查询HBase数据
  4. 4. Thrift 函数默认参数的问题