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

3.3 安裝thrift客戶端

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):刪除指定表指定行中,小於等於此時間戳的所有數據,無返回值

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章