Thrift介绍与应用(三)—hbase的thrift接口

原文: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接口比较简单明了,当然,实际使用时,会进行或多或少的再次封装,以适应自己的应用需要,对该接口的再次封装,这里不在讨论。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/539266.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux/Unix 新手和专家教程

你正在找一些高质量的Linux 和 UNIX 的教程吗&#xff1f;如果是&#xff0c;这篇文章会告诉你到哪去找到这些教程。这里我们将给出超过30个相当的不错的 Linux 和 UNIX 在线的教程。 需要大家注意的是&#xff0c;他们都是英文的&#xff0c;也许有一些也经被翻译到了中文社区…

自动ip的计算机共享打印,局域网内自动获取ip地址怎么设置打印机共享文件夹...

在局域网环境中,为了尽可能地节省办公成本,很多用户都会选择在局域网中架设、部署共享打印机,以便在单位的任何角落处都能方便、自如地进行打印操作。下面是学习啦小编为大家整理的关于局域网内自动获取ip地址怎么设置打印机共享文件夹&#xff0c;一起来看看吧!局域网内自动获…

高级数据分析1代码_用Python进行数据分析,让你一看就会

本书详细介绍利用Python进行操作、处理、清洗和规整数据等方面的具体细节和基本要点。虽然本书的标题是“数据分析”&#xff0c;重点却是Python编程、库&#xff0c;以及用于数据分析的工具。第1章 准备工作第2章 Python语法基础&#xff0c;IPython和Jupyter Notebooks第3章 …

工期日历天计算器_天津实地告诉你:房建项目是怎样保节点,抢工期的?

工程概况天津实地蔷薇花园住宅地块项目共计由24栋单体住宅、2栋配建及地下人防车库组成&#xff0c;其中12层小高层4栋、13层小高层1栋、19栋7层洋房。总建建筑面积为139348.62㎡&#xff0c;地上99348㎡&#xff0c;地下40000㎡&#xff0c;人防面积为14236㎡。工期目标项目施…

thrift介绍及应用(四)—hadoop的thrift接口

原文&#xff1a;http://blog.csdn.net/guxch/article/details/12163519 ----------------------------------------------------------------------------------- 一、概述 hadoop是目前使用比较多的分布式文件系统&#xff0c;由于hadoop是用Java写的&#xff0c;对非Java程…

迟到的年度总结,我们应该收放自如

现在已经2018年3月了&#xff0c;这篇2017的年度总结显得晚了一点&#xff0c;但意义非凡&#xff0c;让我有了更多的反省和思考&#xff0c;我相信大家读完一定会有收获。好了&#xff0c;废话不多说进入主题。别用学习来逃避成长这话说的简直是屁话&#xff0c;不是学习才会成…

测试fps游戏反应速度软件,FPS反应速度提速

静谧无声&#xff0c;生死一瞬&#xff0c;说的就是FPS游戏&#xff0c;没有哪一个种类的游戏可以比拟我们FPS玩家对于反应速度的追求&#xff0c;更快更准哪怕提速只是1毫秒&#xff0c;无数高手之所以为高手就是因为他们可以打出我们看起来不可能完成的击杀&#xff0c;特别是…

html5中单选框被选中把值传给后台_HTML5的表单设计

使用过Delphi的程序员&#xff0c;对Form这个词应该比较熟悉。在Delphi中&#xff0c;Form被翻译为“界面、窗口”&#xff0c;作用是&#xff1a;为用户提供界面&#xff0c;供用户输入信息&#xff0c;向用户展示处理结果。HTML5中也有Form&#xff0c;功能与Delphi中的Form差…

python科赫曲线绘制正方形_Python数据处理从零开始----第四章(可视化)(14)使用seaborn绘制热图...

目录 Python数据处理从零开始----第四章&#xff08;可视化&#xff09;①③多变量绘图 Python数据处理从零开始----第四章&#xff08;可视化&#xff09;&#xff08;14&#xff09;使用seaborn绘制热图 seaborn.heatmapHeat maps显示数字表格数据&#xff0c;其中单元格根据…

Hive的系统架构

一、架构图 二、各组件 用户接口&#xff1a;包括 CLI&#xff08;控制台命令&#xff09;&#xff0c;JDBC/ODBC&#xff0c;WebUI。 CLI&#xff0c;即Shell命令行 JDBC/ODBC 是 Hive 的Java&#xff0c;与使用传统数据库JDBC的方式类似 WebGUI是通过浏览器访问 Hive --…

8266获取网络时间

8266获取网络时间 今天第一次用阿里的博客写点东西感受一下....sntp.sync("ntp1.aliyun.com",function()print("sync succeeded")end,function(index)print("failed : "..index)end)用的SNTP 然后打印时间 time rtctime.epoch2cal(rtctime.get(…

重庆高考计算机分数线,重庆高考历年分数线

2019年一、普通文理类(一) 文史类本科第一批 545分本科第二批 458分高职专科批 180分(二) 理工类本科第一批 525分本科第二批 435分高职专科批 180分二、艺术类(一)本科批1.美术类 336分2.音乐类(1)音乐学 359分(2)音乐表演(声乐、钢琴、器乐) 275分3.编导类 430分4.影视类(1)表…

坐标不显示_Simpack不显示坐标轴方向的解决方法

经常有用户咨询Simpack软件打开模型时&#xff0c;不能显示坐标轴的x、y、z方向&#xff0c;这个问题对建模有很大的影响。本文是兰州交通大学陈龙同学提供的解决方法&#xff0c;供大家参考。使用Simpack软件建模时&#xff0c;会遇到这种情况&#xff1a;比如要创建标记点时&…

th:text为null报错_为vue3.0的学习TS解读高级类型

知识点摘要本节课主要关键词为: 自动类型推断 / 类型断言 / 类型别名(type) / 映射类型(Pick/Record等...) / 条件类型(extends) / 类型推断(infer)自动类型推断(不用你标类型了,ts自己猜)大家现在写ts的时候一定会在每个变量后面都加上类型吧? 但是?现在告诉大家有些情况下你…

Hive与Hadoop的调用关系

一、调用图 二、步骤解析 1、提交sql 交给驱动 2、驱动编译&#xff1a;解析相关的字段表信息 3、去metastore查询相关的信息 返回字段表信息 4、编译返回信息 发给驱动 5、驱动发送一个执行计划 交给执行引擎 6、执行计划 6.1、DDLs 对数据库表的操作的 直接和metastore交互 …

shell发送邮件函数

#发送邮件函数function send_mail(){ #定义邮件发送列表 maillist( zhengwei.liuxxx xiaogang.yangxxx sundy.shexxx ) #根据不同的函数参数&#xff0c;发送不同的邮件 if [ "$1" "gateway" ];thenfor mail in ${maillist[*]};doecho "无法ping通网…

列主元消去法例题详解_高斯列主元消元法解方程组的步骤

高斯列主元消元法求解线性方程组AXb的简要步骤nnnnnnnnbbbxxxaaaaaaaaa2121212222111211方法说明(以4阶为例)&#xff1a;第1步消元——在增广矩阵(A&#xff0c;b)第一列中…

Hive的使用之控制台

启动方式 1、如果将hive的bin&#xff08;/home/hive2.1/bin&#xff09;配置了环境变量&#xff0c;则输入&#xff1a;hive。 2、 #hive --service cli 启动 退出方式 1、hive>quit; 2、ctrlc 实例 ---------hivesql兼容大部分sql------- hive>show tables; hiv…

简述计算机文件的命名办法,如何进行文件命名-如何进行文件管理

如何进行文件命名-如何进行文件管理电脑的管理事实上就是文件和文件夹的管理。想要我们的电脑干净整齐&#xff0c;就需要我们正确的进行文件管理。我们知道了文件和文件夹的概念之后&#xff0c;现在我们再来看看单独的文件&#xff0c;认识一下文件的构成以及文件命名和命名规…

网页加载出现没有合适的负载均衡器_分布式必知必会-七层负载和四层负载到底是什么?...

背景我们在使用负载均衡器的时候&#xff0c;往往会听到七层负载或四层负载这两个名词&#xff0c;许多负载均衡软件提供的方式也不同&#xff0c;那么七层和四层区别在哪呢&#xff1f;为什么有的支持有的不支持呢&#xff1f;负载均衡简介负载均衡建立在现有网络结构之上&…