原文:http://blog.csdn.net/guxch/article/details/12163047

-----------------------------------------------------------------------------------

一、概述

Hbase是目前比较火的列存储数据库,由于Hbase是用Java写的,因此它原生地提供了Java接口,对非Java程序人员,怎么办呢?幸好它提供了thrift接口服务器,因此也可以采用其他语言来编写Hbase的客户端,本文即是Hbase C++接口的介绍。
目前的Hbase(0.94.11,本文即基于此版本)有两套thrift接口(可以叫thrift1和thrift2),它们并不兼容(随意性太强,这可能是所有开源软件都具有的问题)。根据官方文档,thrift1很可能被抛弃,但网上的文章基本是介绍thrift1的,本文则主要介绍thrift2。
要使用Hbase的thrift接口,必须将它的服务启动,命令行为:

[plain] view plaincopy
  1. hbase-deamon.sh start thrift2

thrift默认的监听端口是9090,可以用netstat -nl | grep 9090看看该端口是否有服务。

二、thrift1与thrift2的简单比较

两个版本的thrift文件位于如下位置,

[plain] view plaincopy
  1. src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift
  2. src/main/resources/org/apache/hadoop/hbase/thrift2/hbase.thrift

thrift1的文件有24K左右,而thrift2只有12K左右,看来新版做了大量的简化。
命名空间上,新版都将thrift改为thrift2,以示区别。下表是thrift和thrift2的区别,可以看出,二者真的差别挺大,特别是服务中的方法,thrift2做了简化与合成,并把DDL有关的内容去掉了,关于这些结构、服务的具体意义,请参阅thrift文件中的注释,下文将详细列出。

Thrift

Thrift2

结构

struct TCell

struct ColumnDescriptor

struct TRegionInfo

struct Mutation

struct BatchMutation

struct TIncrement

struct TColumn

struct TRowResult

struct TScan

struct TTimeRange

struct TColumn

struct TColumnValue

struct TColumnIncrement

struct TResult

struct TGet

struct TPut

struct TDelete

struct TIncrement

struct TScan

struct TRowMutations

异常

exception IOError

exception IllegalArgument

exception AlreadyExists

exception TIOError

exception TIllegalArgument

其他

union TMutation

enum TDeleteType

enum TDurability

服务

名称为:Hbase

void enableTable()

void disableTable()

bool isTableEnabled()

void compact()

void majorCompact()

list<Text> getTableNames()

map<Text,ColumnDescriptor> getColumnDescriptors()

list<TRegionInfo> getTableRegions()

void createTable()

void deleteTable()

list<TCell> get()

list<TCell> getVer()

list<TCell> getVerTs()

list<TRowResult> getRow()

list<TRowResult> getRowWithColumns()

list<TRowResult> getRowTs()

list<TRowResult> getRowWithColumnsTs()

list<TRowResult> getRows()

list<TRowResult> getRowsWithColumns()

list<TRowResult> getRowsTs()

list<TRowResult> getRowsWithColumnsTs()

void mutateRow()

void mutateRowTs()

void mutateRows()

void mutateRowsTs()

i64 atomicIncrement()

void deleteAll()

void deleteAllTs()

void deleteAllRow()

void increment()

void incrementRows()

void deleteAllRowTs()

ScannerID scannerOpenWithScan()

ScannerID scannerOpen()

ScannerID scannerOpenWithStop()

ScannerID scannerOpenWithPrefix()

ScannerID scannerOpenTs()

ScannerID scannerOpenWithStopTs()

list<TRowResult> scannerGet()

list<TRowResult> scannerGetList()

void scannerClose()

list<TCell> getRowOrBefore()

TRegionInfo getRegionInfo()

名称为:THBaseService

bool exists(...)

TResult get(...)

list<TResult> getMultiple(...)

void put(...)

bool checkAndPut(...)

void putMultiple(...)

void deleteSingle(...)

list<TDelete> deleteMultiple(...)

bool checkAndDelete(...)

TResult increment(...)

i32 openScanner(...)

list<TResult> getScannerRows(...)

void closeScanner(...)

void mutateRow(...)

list<TResult> getScannerResults(...)

三、thrift2接口客户端生成文件

包含6个文件hbase_constants.cpp/.h、 hbase_types.cpp/.h、THBaseService.cpp/.h,结构的定义都在hbase_types中,服务方法的实现在THBaseService中(关于这几个文件的详细说明,见作者其他博文)。由于我们通常关心数据的查、增、删(对Hbase来说,改是增加一个新“版本”),因此下面的讨论只围绕这些操作展开。

四、thrift2接口主要结构

以下是主要涉及的结构及其意义。

  • TColumn 对列的封装
  • TColumnValue  对列及其值的封装
  • TResult  对单行(Row)及其查询结果(若干colunmvalue)的封装
  • TGet  对查询一行(row)的封装,可以设置行内的查询条件
  • TPut  与TGet一样,只是它是写入若干“列”
  • TDelete  与TGet一样,只是它是删除若干“列”
  • TScan 对查询多行和多列的封装,有点类似于“cursor”
  • TRowMutations 实际上是若干个TDelete和TPut的集合,完成对一行内数据的“原子”操作

五、thrift2接口service函数

1.    查数据

Service中有关查数据的函数如下:

  • get:对某一行内的查询,输入是表名、TGet结构,输出是TResult
  • getMultiple:实际上是对get的扩展,输入是表名、TGet数组,输出是TResult数组
  • openScanner、getScannerRows、closeScanner:这三个连在一起使用,类似于”cursor”,由openScanner打开一个scanner,getScannerRows从这个打开的scanner顺序得到若干行(也就是一个TResult数组,行数可指定),得不到数据行后可认为已读完,最后用closeScanner关闭这个scanner。查询的条件由TScan封装,在打开时传入。需要注意的是每次取数据的行数要合适,否则有效率问题。

2.    增数据

Service中有关添加数据的函数如下:

  • put:对某一行内增加若干列,输入是表名,TPut结构
  • putMultiple:对put的扩展,一次增加若干行内的若个列,输入是表名、TPut数组
  • checkAndPut:这个函数比较有意思,它提供了一种“原子”操作的概念,当传入的(表名+列族名+列名+数据)都存在于数据库时,才做操作,返回true,否则不做任何操作而返回false。可以看出,Hbase内部实现这个操作时肯定是加锁的。它使用的场合如下:某时刻一个用户取得了某个值,以后只有在确保没有其他人操作该值的情况下才能进行更新。

3.    删数据

Service中有关删除数据的函数如下:deleteSingle,deleteMultiple,checkAndDelete,这三个与上面的put函数类似,不再论述。

4.    其他

Service中其他的函数如下:

  • exists:检查表内是否存在某行或某行内某些列,输入是表名、TGet,输出是bool
  • mutateRow:将某行内若干put和delete操作集合起来,形成一个“原子”操作。输入是表名、TRowMutations结构。
  • increment:增加一行内某些列的值,这个操作比较特别,是专门用于计数的,也保证了“原子”操作特性。

需要注意的是,以上大部分函数都是void,如果操作发生错误,thrift的做法是抛出异常,因此进行操作时应有异常捕获处理。

thrift2接口比较简单明了,当然,实际使用时,会进行或多或少的再次封装,以适应自己的应用需要,对该接口的再次封装,这里不在讨论。

Thrift介绍与应用(三)—hbase的thrift接口相关推荐

  1. thrift介绍及应用(二)—简单应用

    原文:http://blog.csdn.net/guxch/article/details/12162131 --------------------------------------------- ...

  2. 由浅入深了解Thrift(一)——Thrift介绍与用法

    相关示例代码见:http://download.csdn.net/detail/hjx_1000/8374829 一.  Thrift简单介绍 1.1.  Thrift是什么?能做什么? Thrift ...

  3. python链接hbase模块_利用python访问Hbase(Thrift模块安装与测试)

    转:http://shineforever.blog.51cto.com/1429204/1567640/ hadoop环境介绍: master服务:node1 slave服务器:node2,node ...

  4. thrift介绍及应用(一)—介绍

    原文:http://blog.csdn.net/guxch/article/details/12157151 --------------------------------------------- ...

  5. Thrift介绍以及Java中使用Thrift实现RPC示例

    场景 Thrift Thrift最初由Facebook研发,主要用于各个服务之间的RPC通信,支持跨语言,常用的语言比如C++, Java, Python,PHP, Ruby, Erlang,Perl ...

  6. java hbase创建_hadoop组件介绍及python 连接Hbase

    Ambari Apache Ambari是一种基于Web的工具,支持Hadoop集群的供应.管理和监控.是Apache顶级开源项目之一,由Hortonworks公司开源. Ø 官方网站地址: http ...

  7. masm32开发com组件介绍[一][二][三]

    标 题:  [原创]masm32开发com组件介绍[一][二][三] 作 者: combojiang 时 间: 2007-12-10,14:09:39 链 接: http://bbs.pediy.co ...

  8. php面试英文自我介绍范文带翻译,外企面试英语自我介绍优秀范文三篇

    篇一:外企面试英语自我介绍 Good morning, my name is xx, it is really a great honor to have this opportunity for a ...

  9. 图数据库JanusGraph介绍及使用(三):安装与初步使用

    图数据库JanusGraph介绍及使用(三):安装与初步使用 作者:家辉,日期:2018-07-05 CSDN博客: http://blog.csdn.net/gobitan 说明:这是图数据库Jan ...

最新文章

  1. 2022图机器学习必读的11大研究趋势和方向: 微分方程/子图表示/图谱理论/非对称/动态性/鲁棒性/通用性/强化学习/图量子等...
  2. 正确配置Linux系统ulimit值的方法
  3. 关于在本地idea当中提交spark代码到远程的错误总结(第二篇)
  4. 618 兵临城下,你需要一个更省钱省力的数据根基平台!
  5. Mongoose快速入门
  6. 阿里云智能视频 AI 重装来袭
  7. pycharm运行模型时怎么设置权重?_使用AMP和Tensor Cores得到更快速,更节省内存的PyTorch模型...
  8. android 自定义库,Android自定义Log库
  9. 构建python应用_构建天气应用
  10. JAVA输出两个顺序链表的并集_(顺序表)两个集合求并集-洋葱先生-杨少通
  11. python处理websocket
  12. hbase中为何不能向表中插入数据_Python自带的数据库,用起来真方便!
  13. Node.js连接mysql报加密方式错误解决方案
  14. android studio for android learning (十九 ) 最新Handler消息传递机制全解
  15. 微信修改步数 Android,安卓微信怎么改步数
  16. win10输入法变成繁体字怎么办 - 如何关闭繁体,简体切换功能
  17. python网络爬虫-淘宝商品比价定向爬虫
  18. 搜索引擎技术/动态资源
  19. android开发笔记之联系人百家姓功能的实现
  20. QT之TreeView

热门文章

  1. java 单例 生命周期_Rhythmk 一步一步学 JAVA (13) Spring-2 之Ben懒加载以及生命周期,单例...
  2. 计算机教案画圆形和方形,画方形和圆形的教案
  3. huffman编码的程序流程图_F28379D之CLB解码多摩川编码器2——LIB版例程讲解(原创)...
  4. java接口中多继承的问题
  5. HTML5中volume样式自定义,html5中关于volume属性的使用详解
  6. mysql到pg怎么高效_干货 | Debezium实现Mysql到Elasticsearch高效实时同步(示例代码)
  7. 联想拯救者y7000加内存条_短测联想拯救者Y7000,到底值不值得买?
  8. linq查询不包含某个值的记录_MySQL行(记录)的详细操作
  9. TensorFlow实验(3)
  10. 持续集成之 Spring Boot 实战篇