2020国产成人精品视频,性做久久久久久久久,亚洲国产成人久久综合一区,亚洲影院天堂中文av色

分享

Thrift介紹與應(yīng)用(三)

 huhuwoo 2015-10-15

一、概述

Hbase是目前比較火的列存儲(chǔ)數(shù)據(jù)庫(kù),由于Hbase是用Java寫(xiě)的,因此它原生地提供了Java接口,對(duì)非Java程序人員,怎么辦呢?幸好它提供了thrift接口服務(wù)器,因此也可以采用其他語(yǔ)言來(lái)編寫(xiě)Hbase的客戶(hù)端,本文即是Hbase C++接口的介紹。
目前的Hbase(0.94.11,本文即基于此版本)有兩套thrift接口(可以叫thrift1和thrift2),它們并不兼容(隨意性太強(qiáng),這可能是所有開(kāi)源軟件都具有的問(wèn)題)。根據(jù)官方文檔,thrift1很可能被拋棄,但網(wǎng)上的文章基本是介紹thrift1的,本文則主要介紹thrift2。
要使用Hbase的thrift接口,必須將它的服務(wù)啟動(dòng),命令行為:
  1. hbase-deamon.sh start thrift2  
thrift默認(rèn)的監(jiān)聽(tīng)端口是9090,可以用netstat -nl | grep 9090看看該端口是否有服務(wù)。

二、thrift1與thrift2的簡(jiǎn)單比較

兩個(gè)版本的thrift文件位于如下位置,
  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左右,看來(lái)新版做了大量的簡(jiǎn)化。
命名空間上,新版都將thrift改為thrift2,以示區(qū)別。下表是thrift和thrift2的區(qū)別,可以看出,二者真的差別挺大,特別是服務(wù)中的方法,thrift2做了簡(jiǎn)化與合成,并把DDL有關(guān)的內(nèi)容去掉了,關(guān)于這些結(jié)構(gòu)、服務(wù)的具體意義,請(qǐng)參閱thrift文件中的注釋?zhuān)挛膶⒃敿?xì)列出。

 

Thrift

Thrift2

結(jié)構(gòu)

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

服務(wù)

名稱(chēng)為: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()

名稱(chēng)為: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接口客戶(hù)端生成文件

包含6個(gè)文件hbase_constants.cpp/.h、 hbase_types.cpp/.h、THBaseService.cpp/.h,結(jié)構(gòu)的定義都在hbase_types中,服務(wù)方法的實(shí)現(xiàn)在THBaseService中(關(guān)于這幾個(gè)文件的詳細(xì)說(shuō)明,見(jiàn)作者其他博文)。由于我們通常關(guān)心數(shù)據(jù)的查、增、刪(對(duì)Hbase來(lái)說(shuō),改是增加一個(gè)新“版本”),因此下面的討論只圍繞這些操作展開(kāi)。

四、thrift2接口主要結(jié)構(gòu)


以下是主要涉及的結(jié)構(gòu)及其意義。

  • TColumn 對(duì)列的封裝
  • TColumnValue  對(duì)列及其值的封裝
  • TResult  對(duì)單行(Row)及其查詢(xún)結(jié)果(若干colunmvalue)的封裝
  • TGet  對(duì)查詢(xún)一行(row)的封裝,可以設(shè)置行內(nèi)的查詢(xún)條件
  • TPut  與TGet一樣,只是它是寫(xiě)入若干“列”
  • TDelete  與TGet一樣,只是它是刪除若干“列”
  • TScan 對(duì)查詢(xún)多行和多列的封裝,有點(diǎn)類(lèi)似于“cursor”
  • TRowMutations 實(shí)際上是若干個(gè)TDelete和TPut的集合,完成對(duì)一行內(nèi)數(shù)據(jù)的“原子”操作

五、thrift2接口service函數(shù)

1.    查數(shù)據(jù)

Service中有關(guān)查數(shù)據(jù)的函數(shù)如下:

  • get:對(duì)某一行內(nèi)的查詢(xún),輸入是表名、TGet結(jié)構(gòu),輸出是TResult
  • getMultiple:實(shí)際上是對(duì)get的擴(kuò)展,輸入是表名、TGet數(shù)組,輸出是TResult數(shù)組
  • openScanner、getScannerRows、closeScanner:這三個(gè)連在一起使用,類(lèi)似于”cursor”,由openScanner打開(kāi)一個(gè)scanner,getScannerRows從這個(gè)打開(kāi)的scanner順序得到若干行(也就是一個(gè)TResult數(shù)組,行數(shù)可指定),得不到數(shù)據(jù)行后可認(rèn)為已讀完,最后用closeScanner關(guān)閉這個(gè)scanner。查詢(xún)的條件由TScan封裝,在打開(kāi)時(shí)傳入。需要注意的是每次取數(shù)據(jù)的行數(shù)要合適,否則有效率問(wèn)題。

2.    增數(shù)據(jù)

Service中有關(guān)添加數(shù)據(jù)的函數(shù)如下:

  • put:對(duì)某一行內(nèi)增加若干列,輸入是表名,TPut結(jié)構(gòu)
  • putMultiple:對(duì)put的擴(kuò)展,一次增加若干行內(nèi)的若個(gè)列,輸入是表名、TPut數(shù)組
  • checkAndPut:這個(gè)函數(shù)比較有意思,它提供了一種“原子”操作的概念,當(dāng)傳入的(表名+列族名+列名+數(shù)據(jù))都存在于數(shù)據(jù)庫(kù)時(shí),才做操作,返回true,否則不做任何操作而返回false??梢钥闯觯琀base內(nèi)部實(shí)現(xiàn)這個(gè)操作時(shí)肯定是加鎖的。它使用的場(chǎng)合如下:某時(shí)刻一個(gè)用戶(hù)取得了某個(gè)值,以后只有在確保沒(méi)有其他人操作該值的情況下才能進(jìn)行更新。

3.    刪數(shù)據(jù)

Service中有關(guān)刪除數(shù)據(jù)的函數(shù)如下:deleteSingle,deleteMultiple,checkAndDelete,這三個(gè)與上面的put函數(shù)類(lèi)似,不再論述。

4.    其他

Service中其他的函數(shù)如下:

  • exists:檢查表內(nèi)是否存在某行或某行內(nèi)某些列,輸入是表名、TGet,輸出是bool
  • mutateRow:將某行內(nèi)若干put和delete操作集合起來(lái),形成一個(gè)“原子”操作。輸入是表名、TRowMutations結(jié)構(gòu)。
  • increment:增加一行內(nèi)某些列的值,這個(gè)操作比較特別,是專(zhuān)門(mén)用于計(jì)數(shù)的,也保證了“原子”操作特性。


需要注意的是,以上大部分函數(shù)都是void,如果操作發(fā)生錯(cuò)誤,thrift的做法是拋出異常,因此進(jìn)行操作時(shí)應(yīng)有異常捕獲處理。


thrift2接口比較簡(jiǎn)單明了,當(dāng)然,實(shí)際使用時(shí),會(huì)進(jìn)行或多或少的再次封裝,以適應(yīng)自己的應(yīng)用需要,對(duì)該接口的再次封裝,這里不在討論。




    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多