使用C#和Thrift來訪問Hbase實例

今天試着用C#和Thrift來訪問Hbase,主要參考了博客園上的這篇文章。查了Thrift,Hbase的資料,結合博客園的這篇文章,終於搞好了。期間經歷了很多彎路,下面我儘可能詳細的記錄下來,省得你們走彎路。html

本文的環境:web

Hbase 0.94.1apache

VS2012(.NetFramework 4.0)框架

Thrifit 0.7.0(點此下載函數

必定要注意各產品的版本號,不一樣的版本可能相互不兼容。工具

下面開始幹活:oop

0.開啓Hbase的Thrift服務測試

在Hbase的master上運行:hbase-daemon.sh start thrift -threadpool 大數據

1.下載Thrift 0.7.0的源碼和代碼生成工具(姑且這麼叫)atom

從上面提供的Thrift下載頁面中的目錄裏分別下載代碼生成工具:

thrift-0.7.0.exe  

和Thrift源代碼:

thrift-0.7.0.tar.gz 

2.編譯Thrift

用VS2012新建一個解決方案,而後再在解決方案中新建一個類庫的項目,我起名叫thrift-0.7.0,目標框架選擇.Net Framework4,將下載後的thrift-0.7.0.tar.gz解壓後的thrift-0.7.0\lib\csharp\src目錄下的除Thrift.csproj和Thrift.sln這兩個文件外的全部文件和文件夾都拷貝到在vs中新建的這個項目中(在vs的解決方案資源管理器中選中該項目,Ctrl+V便可),如今編譯該項目,以生成thrift-0.7.0.dll。

3.生成代碼

將Hbase安裝包解壓,或者從現有集羣上拷貝也可。找到這個目錄:hbase/src/main/resources/org/apache/hadoop/hbase/thrift,在該目錄下找到文件Hbase.thrift。注意,千萬不要找到thrift2目錄裏去了,我就在這裏走了彎路,由於thrift2比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(...)

 

好了,書歸正傳,閒言少敘,我們繼續幹活。在VS中新建類庫項目,命名爲ThriftHbaseCommon,目標框架依然是.Net Framework 4,爲該項目添加對項目thrift-0.7.0的引用。將Hbase.thrift複製到和剛纔下載的thrift-0.7.0.exe同一個目錄,固然你也能夠不放在同一個目錄,不過這樣的話,你生成代碼的時候就得多打幾個字,我是放在D:\thrift\0.7.0目錄中。打開命令行,進入到該目錄,運行thrift-0.7.0.exe  -gen csharp hbase.thrift 。一眨眼的功夫命令就執行完畢了,而後在該目錄下會生成gen-csharp文件夾,打開該文件夾,拷貝全部文件到ThriftHbaseCommon項目中去,方法跟第二步講的同樣。編譯該項目。

4.編寫測試代碼

在VS中新建控制檯項目,命名爲TestConsoleApplication,目標框架依然是.Net Framework 4,爲該項目添加對項目ThriftHbaseCommon的引用。在Program.cs的main函數中輸入如下代碼:

 TTransport transport = null;
            try
            {
                //實例化Socket鏈接
                transport = new TSocket("192.168.10.101", 9090);
                //實例化一個協議對象
                TProtocol tProtocol = new TBinaryProtocol(transport);
                //實例化一個Hbase的Client對象
                var client = new Hbase.Client(tProtocol);
                //打開鏈接
                transport.Open();
                //根據表名,RowKey名來獲取結果集
                List<TRowResult> reslut = client.getRow(Encoding.UTF8.GetBytes("dz_CDN_Ip_Stat"), Encoding.UTF8.GetBytes("201310_001_0_1100"), null);
                //遍歷結果集
                foreach (var key in reslut)
                {
                    Console.WriteLine("RowKey:\n{0}",Encoding.UTF8.GetString(key.Row));
                    //打印Qualifier和對應的Value
                    foreach (var k in key.Columns)
                    {
                        Console.WriteLine("Family:Qualifier:" + "\n" + Encoding.UTF8.GetString(k.Key));
                        Console.WriteLine("Value:"+Encoding.UTF8.GetString(k.Value.Value));
                    }
                }
            }
            catch (Exception e)
            {
                System.Console.WriteLine(e);
            }
            finally
            {
                if (null != transport)
                {
                    transport.Close();
                }
            }
            Console.ReadLine();

  

 

如今調試該項目,因爲個人表中該key對應的值爲24,因此程序打印出以下結果:

RowKey:
201310_001_0_1100
Family:Qualifier:
d:ipn
Value:24

至此,用C#和Thrift鏈接Hbase的功能實現完畢。

 實例中的所有源代碼在這裏下載。

 

 

本文已同步至大數據技術http://cloudera.org.cn ),文章地址:http://cloudera.org.cn/?p=21

相關文章
相關標籤/搜索