標籤:des style blog http os 使用 io strong for
1.開啟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 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的功能實現完畢。
使用C#和Thrift來訪問Hbase執行個體