zoukankan      html  css  js  c++  java
  • 使用C#和Thrift来访问Hbase实例

    今天试着用C#和Thrift来访问Hbase,主要参考了博客园上的这篇文章。查了Thrift,Hbase的资料,结合博客园的这篇文章,终于搞好了。期间经历了不少弯路,下面我尽量详细的记录下来,免得大家走弯路。

    本文的环境:

    Hbase 0.94.1

    VS2012(.NetFramework 4.0)

    Thrifit 0.7.0(点此下载

    一定要注意各产品的版本号,不同的版本可能相互不兼容。

    下面开始干活:

    0.开启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.0libcsharpsrc目录下的除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 TCell

    struct ColumnDescriptor

    struct TRegionInfo

    struct Mutation

    struct BatchMutation

    struct TIncrement

    struct TColumn

    struct TRowResult

    struct TScan

    struct TTimeRange

    struct TColumn

    struct TColumnValue

    struct TColumnIncrement

    struct TResult

    struct TGet

    struct TPut

    struct TDelete

    struct TIncrement

    struct TScan

    struct TRowMutations

    异常

    exception IOError

    exception IllegalArgument

    exception AlreadyExists

    exception TIOError

    exception TIllegalArgument

    其他

    union TMutation

    enum TDeleteType

    enum TDurability

    服务

    名称为:Hbase

    void 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()

    名称为:THBaseService

    bool 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: hrift.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:
    {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();
    

      

    现在调试该项目,由于我的表中该key对应的值为24,所以程序打印出如下结果:

    RowKey:
    201310_001_0_1100
    Family:Qualifier:
    d:ipn
    Value:24

    至此,用C#和Thrift连接Hbase的功能实现完毕。

     实例中的全部源代码在这里下载。

    本文已同步至大数据技术http://cloudera.org.cn ),文章地址:http://cloudera.org.cn/?p=21

  • 相关阅读:
    VUE处理项目中的ESLint语法报错问题
    通过Focas连接Fanuc的NC Guide
    IdentityServer
    Dapper2.0.78手册翻译
    Framework项目持续集成(jenkins)及集合SonarQube
    基于 GitBook 搭建个人博客
    GitBook 常用插件
    Vue管理系统前端系列六动态路由-权限管理实现
    Vue管理系统前端系列五自定义主题
    Vue管理系统前端系列四组件拆分封装
  • 原文地址:https://www.cnblogs.com/sixiweb/p/3556026.html
Copyright © 2011-2022 走看看