python3訪問HBase數據庫
1 介紹
- Hbase是用Java寫的,它原生地提供了Java接口,對非Java程序人員,它也提供了thrift接口,因此也可以採用其他語言來編寫Hbase的客戶端,本文即介紹了python通過thrift接口訪問HBase數據庫的方法。
- 目前Hbase有兩套thrift接口(thrift和thrift2),它們並不兼容。根據官方文檔,thrift很可能被拋棄,但網上的文章基本是介紹thrift的,我們這裏採用的也是thrift。
software | version |
---|---|
HBase | 1.2.9 |
Python | 3.6.3 |
Thrift | 0.11.0 |
2 啓動thrift-server
要使用Hbase的thrift接口,必須將它的服務啓動,啓動Hbase的thrift-server進程如下:
cd /home/hbase-1.2.9/
./hbase-daemon.sh start thrift
執行jps命令檢查:
34533 ThriftServer
- thrift默認端口是9090,啓動成功後可以查看端口是否起來
3 安裝thrift-client
3.1 安裝依賴
yum -y install automake libtool flex bison pkgconfig gcc-c++ boost-devel libevent-devel zlib-devel python-devel ruby-devel openssl-devel
3.2 安裝boost
wget http://sourceforge.net/projects/boost/files/boost/1.53.0/boost_1_53_0.tar.gz
tar xvf boost_1_53_0.tar.gz
cd boost_1_53_0
./bootstrap.sh
./b2 install
- 在線下載較慢,給,不用客氣 boost_1_53_0.tar.gz
3.3 安裝thrift客戶端
- 在線下載較慢,給,不用客氣 thrift-0.11.0.tar.gz
wget http://mirrors.hust.edu.cn/apache/thrift/0.11.0/thrift-0.11.0.tar.gz
tar xzvf thrift-0.11.0.tar.gz
cd thrift-0.11.0
./configure --with-cpp --with-boost --with-python --without-csharp --with-java --without-erlang --without-perl --with-php --without-php_extension --without-ruby --without-haskell --without-go
make && make install
- make可能報錯如下:
g++: error: /usr/lib64/libboost_unit_test_framework.a: No such file or directory
- 解決辦法:
find / -name libboost_unit_test_framework.*
cp /usr/local/lib/libboost_unit_test_framework.a /usr/lib64/
4 使用python3連接Hbase(hbase-thrift)
- 安裝所需包
pip install thrift
pip install hbase-thrift
- python 腳本如下:
from thrift.transport import TSocket
from hbase import Hbase
from hbase.ttypes import *
transport = TSocket.TSocket('192.168.18.150', 9090)
protocol = TBinaryProtocol.TBinaryProtocol(transport)
client = Hbase.Client(protocol)
transport.open()
print(client.getTableNames())
- 腳本報錯
File "<ipython-input-1-e17848ba7457>", line 1, in <module>
import hbase.Hbase
File "D:\software\Anaconda3\Lib\site-packages\hbase\Hbase.py", line 2066
except IOError, io:
^
AttributeError: 'dict' object has no attribute 'iteritems'
- 原因:python版本帶來的語法不兼容問題
- 解決如下:
替換原來Hbase.py和ttypes.py文件
5 常用方法介紹
- createTable(tbaleName,columnFamilies):創建表,無返回值
column1 = ColumnDescriptor('meta')
column2 = ColumnDescriptor('data')
client.createTable('test4', [column1, column2])
- enabledTable(tbaleName):啓用表,無返回值
# 啓用表,若表之前未被禁用將會引發IOError錯誤
client.enableTable('test4')
- disableTable(tbaleName):禁用表,無返回值
# 禁用表,若表之前未被啓用將會引發IOError錯誤
client.disableTable('test4')
- isTableEnabled(tbaleName):驗證表是否被啓用,返回一個bool值
print(client.isTableEnabled('test4'))
- getTableNames(tbaleName):獲取表名列表,返回一個str列表
print(client.getTableNames())
- getColumnDescriptors(tbaleName):獲取所有列族信息,返回一個字典
a = client.getTableRegions('test4')
for i in a:
print("序號:%s 值:%s" % (a.index(i) + 1, i))
- deleteTable(tbaleName):刪除表,無返回值
client.deleteTable('test4')
- get(tableName,row,column):獲取數據列表,返回一個hbase.ttypes.TCell對象列表
print(client.get('sl_tbl', '00_2018-09-16 00:00:00.000_SL070105_000000.SL', 'info:sensorTypeFull'))
-
getRow(tableName,row):獲取表中指定行在最新時間戳上的數據。返回一個hbase.ttypes.TRowResult對象列表,如果行號不存在返回一個空列表
-
getRowWithColumns(tableName,row,columns):獲取表中指定行與指定列在最新時間戳上的數據。返回一個hbase.ttypes.TRowResult對象列表,如果行號不存在返回一個空列表
-
getRowTs(tableName,row,timestamp):獲取表中指定行並且小於這個時間戳的所有數據。返回一個hbase.ttypes.TRowResult對象列表,如果行號不存在返回一個空列表
-
getRowWithColumnsTs(tableName,row,columns,timestamp):獲取指定行與指定列,並且小於這個時間戳的所有數據。返回一個hbase.ttypes.TRowResult對象列表,如果行號不存在返回一個空列表
-
deleteAll(tableName,row,column):刪除指定表指定行與指定列的所有數據,無返回值
-
deleteAllTs(tableName,row,column,timestamp):刪除指定表指定行與指定列中,小於等於指定時間戳的所有數據,無返回值
-
deleteAllRow(tableName,row):刪除整行數據,無返回值
-
deleteAllRowTs(tableName,row,timestamp):刪除指定表指定行中,小於等於此時間戳的所有數據,無返回值