Hadoop中的HBase有多種數據訪問方式,ubuntu裏能夠用hbase shell查看操做hbase數據庫,但windows平臺下須要用thrift對它進行訪問。shell
例如hadoop安裝在/usr/local/hadoop,hbase在/usr/local/hbase,thrift在/usr/local/thrift,則hbase.thrift文件應該使用 hbase/src/main/resources/org/apache/hadoop/hbase/thrift/hbase.thrift這個文件。thrift2目錄下的hbase.thrift生成的方法不一樣,很差用。數據庫
1. 到thrift目錄下,運行apache
bin/thrift -gen csharp /usr/local/hbasesrc/main/resources/org/apache/hadoop/hbase/thrift/hbase.thriftubuntu
會在當前目錄生成gen-csharp文件夾,運行 zip -r cs.zip gen-csharp 打包到cs.zip,用ftp傳輸給windows。c#
2. 把thrift目錄裏的thrift c#訪問類代碼也打包傳輸到windows。windows
/usr/local/thrift/lib/csharp,src目錄裏有Thrift.csproj服務器
3. 創建TestHbaseClient控制檯程序,把Thrift項目加入solution。創建HBaseCommon項目,把gen-csharp裏的文件都加入到此項目,最好給每一個文件都加上命名空間。HBaseCommon引用Thrift,TestHbaseClient引用其它兩個項目。分佈式
在Main函數裏:函數
1 TTransport transport = new TSocket("192.168.16.105", 9090); 2 TProtocol tProtocol = new TBinaryProtocol(transport); 3 var client = new Hbase.Client(tProtocol); 4 transport.Open(); 5 6 List<byte[]> tbs = client.getTableNames(); 7 foreach (byte[] tb in tbs) 8 { 9 string tn = Encoding.UTF8.GetString(tb); 10 Console.WriteLine("table:" + tn); 11 } 12 13 List<TRowResult> reslut = client.getRow(Encoding.UTF8.GetBytes("case_info"), Encoding.UTF8.GetBytes("row1"), null); 14 foreach (var key in reslut) 15 { 16 Console.WriteLine(Encoding.UTF8.GetString(key.Row)); 17 foreach (var k in key.Columns) 18 { 19 Console.Write(Encoding.UTF8.GetString(k.Key) + "\t"); 20 Console.WriteLine(Encoding.UTF8.GetString(k.Value.Value)); 21 } 22 }
4. 運行這段代碼,會報錯,連不上服務器,須要到hbase裏設置一下,並啓動thrift服務。oop
修改/usr/local/hbase/conf/hbase-site.xml,先加個僞分佈式進行測試:
<property>
<name>hbase.rootdir</name>
<value>/home/hadoop/hbasedir</value>
</property>
到/usr/local/hbase目錄下重啓hbase服務
bin/hbase-start.sh
再運行bin/hbase-daemon.sh start thrift
如今就能夠用C#去訪問hbase數據庫的內容了。