今天試着用C#和Thrift來訪問Hbase,主要參考了博客園上的這篇文章。查了Thrift,Hbase的資料,結合博客園的這篇文章,終於搞好了。期間經歷了不少彎路,下面我盡量詳細的記錄下來,免得大家走彎路。
本文的環境:
Hbase 0.94.1
VS2012(.NetFramework 4.0)
Thrifit 0.7.0(點此下載)
一定要注意各產品的版本號,不同的版本可能相互不兼容。
下面開始干活:
0.開啟Hbase的Thrift服務
在Hbase的master上運行:hbase-daemon.sh start thrift -threadpool
1.下載Thrift 0.7.0的源碼和代碼生成工具(姑且這么叫)
從上面提供的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
