知识库 : 如何在Python中访问HBase的数据

 

一、 背景介绍

目前爬虫系统和舆情系统的数据都存储在UDH大数据平台的HBase中,在程序开发过程中会需要使用Python程序访问HBase数据库,并操作其中的数据,本文重点讲述环境准备过程中的问题。

二、 安装Python

去Python官方网站(https://www.python.org)下载Python 2.7版本的压缩包,之后按照如下步骤进行解压并安装:

tar zxvf Python-2.7.10.tgz

cd Python-2.7.10

./configure --prefix=/usr --with-bz2

make && make install

三、 安装Thrift

去Apache的Thrift官网(http://thrift.apache.org)下载Thrift 0.9.2版本的压缩包,之后按照如下步骤进行解压并安装:

tar zxvf thrift-0.9.2.tar.gz

cd thrift-0.9.2

./configure

make && make install

四、 生成HBase的Thrift脚本

在已经安装了HBase服务的服务器中,已经自动安装了HBase的Thrift的脚本,路径为:/usr/lib/hbase/include/thrift 。

需要使用这个脚本生成基于Python语言的HBase的Thrift脚本,具体命令如下:

thrift --gen py hbase2.thrift

 

命令执行成功后会生成名为gen-py的目录,其中包含了python版本的HBase包。

主要文件介绍如下:

l   Hbase.py 中定义了一些HbaseClient可以使用的方法

l   ttypes.py中定义了HbaseClient传输的数据类型

将生成的HBase包放入项目代码或者放入Python环境的依赖包目录中即可调用。

五、 连接HBase

Python连接HBase时需要先加载Thrift和HBase的相关包,之后创建与HBase的连接并进行后续操作,具体代码如下:

# -*- coding: utf-8 -*-

import sys

reload(sys)

sys.setdefaultencoding('utf-8')

from thrift.transport.TSocket import TSocket

from thrift.transport.TTransport import TBufferedTransport

from thrift.protocol import TBinaryProtocol

from hbase import Hbase

from hbase.ttypes import *

import pymongo

import hashlib

import time

from datetime import datetime

 

 

class HBaseOperator():

     def __init__(self):

                 self.host = "ip_address"

                 self.port = 9090

                 self.transport = TBufferedTransport(TSocket(self.host, self.port))

                 self.transport.open()

                 self.protocol = TBinaryProtocol.TBinaryProtocol(self.transport)

                 self.client = Hbase.Client(self.protocol)

 

     def __del__(self):

                 self.transport.close()

 

     def getAllTablesInfo(self):

                 #get table info

                 listTables = self.client.getTableNames()

                 print "="*40

                 print "Show all tables information...."

 

                 for tableName in listTables:

                             print "TableName:" + tableName

                             print " "

                             listColumns = self.client.getColumnDescriptors(tableName)

                             print listColumns

                             print " "

 

                             listTableRegions = self.client.getTableRegions(tableName)

                             print listTableRegions

                             print "+"*40