今天试着用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.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 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:\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的功能实现完毕。

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

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

使用C#和Thrift来访问Hbase实例的更多相关文章

  1. 使用C#通过Thrift访问HBase

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

  2. HBase(二): c#访问HBase之股票行情Demo

    上一章完成了c#访问hbase的sdk封装,接下来以一个具体Demo对sdk进行测试验证.场景:每5秒抓取指定股票列表的实时价格波动行情,数据下载后,一方面实时刷新UI界面,另一方面将数据放入到在内存 ...

  3. HBase(一): c#访问hbase组件开发

    HDP2.4安装系列介绍了通过ambari创建hbase集群的过程,但工作中一直采用.net的技术路线,如何去访问基于Java搞的Hbase呢? Hbase提供基于Java的本地API访问,同时扩展了 ...

  4. windows平台下用C#访问HBase

    Hadoop中的HBase有多种数据访问方式,ubuntu里可以用hbase shell查看操作hbase数据库,但windows平台下需要用thrift对它进行访问. 例如hadoop安装在/usr ...

  5. CDH 6.0.1 版本 默认配置下 HUE | happybase 无法访问 Hbase 的问题

    第一个问题 HUE 无法直接连接到 HBase 在默认配置下 CDH 6.0.1 版本下的 HBase2.0 使用了默认配置 hbase.regionserver.thrift.compact = T ...

  6. PHP通过thrift2访问HBASE

    前一段时间需要在网页上显示HBASE查询的结果,考虑用PHP来实现,在网上搜了一下,普遍都是用thrift作为接口来实现的.​ 参考博文:​ http://www.cnblogs.com/scotom ...

  7. Thrift入门及Java实例演示<转载备用>

    Thrift入门及Java实例演示 作者: Michael 日期: 年 月 日 •概述 •下载配置 •基本概念 .数据类型 .服务端编码基本步骤 .客户端编码基本步骤 .数据传输协议 •实例演示(ja ...

  8. android post 方式 访问网络 实例

    android post 方式 访问网络 实例 因为Android4.0之后对使用网络有特殊要求,已经无法再在主线程中访问网络了,必须使用多线程访问的模式 该实例需要在android配置文件中添加 网 ...

  9. java操作Hbase实例

    所用HBase版本为1.1.2,hadoop版本为2.4 /* * 创建一个students表,并进行相关操作 */ import java.io.IOException; import java.u ...

随机推荐

  1. Go语言中的RPC调用

    首先,说一下目录结构: 一.HttpRPC 1.建立服务文件 /*Go RPC的函数只有符合下面的条件才能被远程访问,不然会被忽略,详细的要求如下: 函数必须是导出的(首字母大写) 必须有两个导出类型 ...

  2. PYQT操作JS并且截图事例

    如何安装PYQT,可以查看我的上一篇文章:http://www.cnblogs.com/liqiu/p/3361948.html 然后运行下面的带有JS程序的Python脚本即可: #-*- codi ...

  3. Vue为什么没有templateUrl

    Why Vue.js doesn't support templateURL Vue.js为什么不支持templateUrl模式 原因 templateUrl使用ajax的方式在运行时加载templa ...

  4. Angularjs乱记

    http://www.cnblogs.com/floor/p/6652313.html 在指令中使用filter DI规则 AngularJS注入规则 数据绑定 http://www.cnblogs. ...

  5. 用Power BI解读幸福星球指数

    "你幸福吗?"已经成了网络热词,简单的问句背后蕴含着一个普通中国人对于所处时代的政治.经济.自然环境等方方面面的感受和体会.引发当代中国人对幸福的深入思考.实际上,国际上对幸福的讨 ...

  6. nagios加入被监控的机器

    此工作大约用时: 30min 准备工作, 在被监控机上 yum install -y gcc glibc glibc-common gd gd-devel xinetd openssl-devel 0 ...

  7. SQL Server复制故障(1)

    初始化时报错 错误消息: The process could not read file '\\176WINDOWSSQL\ReplData\unc\176WINDOWSSQL_DB2_TEST3\2 ...

  8. java HMAC_SHA1加密算法

      java HMAC_SHA1加密算法 CreationTime--2018年7月14日16点46分 Author:Marydon 1.准备工作 import javax.crypto.Mac; i ...

  9. 如何实现两台Domino之间的相互访问

    一)交叉验证    1启动Administrator软件,连接到您的服务器,点击"配置"标签.    2点击右边屏幕"工具"--"验证字"--"交叉验证"    3选择您自己的cert.id,输入其口 ...

  10. mybatis generator(MyBatis的逆向工程)

    1创建数据表 如图所示:我的是在text数据库中创建了一个Student表,字段有id(int),   name(varchar),     age(int),    score(int) 2创建项目 ...