• 使用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

  • 相关阅读:
    不打无准备之仗,最全868道Java面试题及答案
    准备两个月,面试五分钟,Java岗面试为何越来越难?
    2020JAVA面试必备的26个关键知识点,刷完大厂随便跳
    2020年最全java面试真题解析(980道),你没见过的面试题都在这
    java大厂面试200+(含答案):基础+缓存+网络+分布式....
    判断js中的数据类型的几种方法
    JPG、PNG、GIF、SVG 等格式图片区别
    js闭包
    什么是 js 变量提升 (Javascript Hoisting)
    js函数声明和函数表达式的区别
  • 原文地址:https://www.cnblogs.com/keitsi/p/5368670.html
Copyright © 2020-2023  润新知