1.開啓Hbase的Thrift服務apache
在Hbase的master上運行:hbase-daemon.sh start thrift -threadpool框架
1.下載Thrift 0.7.0的源碼和代碼生成工具(姑且這麼叫)函數
從上面提供的Thrift下載頁面中的目錄裏分別下載代碼生成工具:工具
thrift-0.7.0.exe
和Thrift源代碼:oop
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。atom
3.生成代碼spa
將Hbase安裝包解壓,或者從現有集羣上拷貝也可。找到這個目錄:hbase/src/main/resources/org/apache/hadoop/hbase/thrift,在該目錄下找到文件Hbase.thrift。注意,千萬不要找到thrift2目錄裏去了,我就在這裏走了彎路,由於thrift2比thrift精簡了很多接口,並且調用方式及接口參數也已經改變了。具體參考這個文章。算了,我仍是貼出來吧,省得文章失效:.net
Thrift命令行 |
Thrift2 |
|
結構 | struct TCellstruct ColumnDescriptorstruct TRegionInfostruct Mutationstruct BatchMutation
struct TIncrement struct TColumn struct TRowResult struct TScan |
struct TTimeRangestruct TColumnstruct TColumnValuestruct TColumnIncrementstruct TResult
struct TGet struct TPut struct TDelete struct TIncrement struct TScan struct TRowMutations |
異常 | exception IOErrorexception IllegalArgumentexception AlreadyExists | exception TIOErrorexception TIllegalArgument |
其餘 | union TMutationenum TDeleteTypeenum TDurability | |
服務 | 名稱爲:Hbasevoid 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() |
名稱爲:THBaseServicebool 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的功能實現完畢。