日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Thrift介紹與應用(三)

 huhuwoo 2015-10-15

一、概述

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

二、thrift1與thrift2的簡單比較

兩個版本的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左右,看來新版做了大量的簡化。
命名空間上,新版都將thrift改為thrift2,以示區(qū)別。下表是thrift和thrift2的區(qū)別,可以看出,二者真的差別挺大,特別是服務中的方法,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中,服務方法的實現(xiàn)在THBaseService中(關于這幾個文件的詳細說明,見作者其他博文)。由于我們通常關心數(shù)據(jù)的查、增、刪(對Hbase來說,改是增加一個新“版本”),因此下面的討論只圍繞這些操作展開。

四、thrift2接口主要結構


以下是主要涉及的結構及其意義。

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

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

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

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

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

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

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

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

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

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

4.    其他

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

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


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


thrift2接口比較簡單明了,當然,實際使用時,會進行或多或少的再次封裝,以適應自己的應用需要,對該接口的再次封裝,這里不在討論。




    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多