使用C#通过Thrift访问HBase

前言

因为项目需要要为客户程序提供C#.Net的HBase访问接口,而HBase并没有提供原生的.Net客户端接口,可以通过启动HBase的Thrift服务来提供多语言支持。

Thrift介绍

环境

把环境贴出来是因为不同版本的组件之间可能会存在兼容性的问题

Thrift安装:传送门

HBase: 1.0.3

Thrift: 0.9.3

 


启动HBase的Thrift服务

HBase 提供两个版本的Thrift服务:Thrift 和 Thrift2

Thrift 和 Thrift2 介绍:传送门

个人更喜欢新版本的Thrift2,更简单、更强大

注:同一时间只能启动一个版本的Thrift服务

启动Thrift:

bin/hbase thrift -b HadoopMaster -p 9099 start

 启动Thrift2:

bin/hbase thrift2 -b HadoopMaster -p 9099 start

编译Thrift的C#客户端

从Thrift的源码里找到C#客户端的源码,路径:libcsharp

Thrift 0.9.3 源码下载:传送门

用VS打开解决方案,编译生成:Thrift.dll

生成基于Thrift的HBase C#客户端代码

从HBase的源码里找到Hbase.thrift文件

Thrift:hbase-thriftsrcmain esourcesorgapachehadoophbase hrift

Thrift2:hbase-thriftsrcmain esourcesorgapachehadoophbase hrift2

HBase 1.0.3 源码下载:传送门

  • 代码生成:

Windows

  1. 下载Thrift的代码生成器thrift-0.9.3.exe 传送门
  2. 把Hbase.thrift和thrift-0.9.3.exe放到同一目录并执行命令
    thrift-0.9.3.exe  -gen csharp hbase.thrift 
  3. 执行上面命令后会在当前目录生成一个包含C#代码的文件夹:gen-csharp

Linux

  1. 在终端执行命令
    thrift --gen csharp Hbase.thrift
  2. 执行上面命令后会在当前目录生成一个包含C#代码的文件夹:gen-csharp
  • 类库生成:
  1. 新建一个C#类库项目ThriftHbaseClient并把gen-csharp里面的代码拷贝到新项目中
  2. 引用Thrift项目
  3. 编译生成 ThriftHbaseClient.dll

Hbase C#客户端测试

  1. 新建一个控制台项目
  2. 引用ThriftHbaseClient和Thrift项目
  3. 在main函数插入下面代码

Thrift 版本:

TTransport transport = null;
try
{
    //实例化Socket连接
    transport = new TSocket("192.168.1.10", 9099);
    //实例化一个协议对象
    TProtocol tProtocol = new TBinaryProtocol(transport);
    //实例化一个Hbase的Client对象
    var client = new Hbase.Client(tProtocol);
    //打开连接
    transport.Open();
    //根据表名,RowKey名来获取结果集
    List<TRowResult> reslut = client.getRow(Encoding.UTF8.GetBytes("Test"), Encoding.UTF8.GetBytes("row1"), null);
    //遍历结果集
    foreach (var key in reslut)
    {
        Console.WriteLine("RowKey:
{0}", Encoding.UTF8.GetString(key.Row));
        //打印Qualifier和对应的Value
        foreach (var k in key.Columns)
        {
            Console.WriteLine("Family:Qualifier:" + "
" + 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();

Thrift2 版本:

TTransport transport = null;
try
{
    transport = new TSocket("192.168.1.10", 9099);
    TProtocol tProtocol = new TBinaryProtocol(transport);
    var client = new THBaseService.Client(tProtocol);
    //open connection
    transport.Open();
    //get row
    TGet get = new TGet();
    get.Row = Encoding.UTF8.GetBytes("row1");
    TResult reslut = client.get(Encoding.UTF8.GetBytes("test"), get);
    //print results
    Console.WriteLine("RowKey:
{0}", Encoding.UTF8.GetString(reslut.Row));
    foreach (var k in reslut.ColumnValues)
    {
        Console.WriteLine("Family:Qualifier:" + "
" + Encoding.UTF8.GetString(k.Family) + ":" + Encoding.UTF8.GetString(k.Qualifier));
        Console.WriteLine("Value:" + Encoding.UTF8.GetString(k.Value));
    }
}
catch (Exception e)
{
    System.Console.WriteLine(e);
}
finally
{
    if (null != transport)
    {
        transport.Close();
    }
}
Console.ReadLine();

参考:

http://www.cnblogs.com/sixiweb/p/3556026.html

原文地址:https://www.cnblogs.com/keitsi/p/5368670.html