使用C#通过Thrift访问HBase
前言
因为项目需要要为客户程序提供C#.Net的HBase访问接口,而HBase并没有提供原生的.Net客户端接口,可以通过启动HBase的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 start
启动Thrift2:
bin/hbase thrift2 -b HadoopMaster -p start
编译Thrift的C#客户端
从Thrift的源码里找到C#客户端的源码,路径:\lib\csharp
Thrift 0.9.3 源码下载:传送门
用VS打开解决方案,编译生成:Thrift.dll
生成基于Thrift的HBase C#客户端代码
从HBase的源码里找到Hbase.thrift文件
Thrift:hbase-thrift\src\main\resources\org\apache\hadoop\hbase\thrift\
Thrift2:hbase-thrift\src\main\resources\org\apache\hadoop\hbase\thrift2\
HBase 1.0.3 源码下载:传送门
- 代码生成:
Windows
- 下载Thrift的代码生成器thrift-0.9.3.exe 传送门
- 把Hbase.thrift和thrift-0.9.3.exe放到同一目录并执行命令
thrift-0.9..exe -gen csharp hbase.thrift
- 执行上面命令后会在当前目录生成一个包含C#代码的文件夹:gen-csharp
Linux
- 在终端执行命令
thrift --gen csharp Hbase.thrift
- 执行上面命令后会在当前目录生成一个包含C#代码的文件夹:gen-csharp
- 类库生成:
- 新建一个C#类库项目ThriftHbaseClient并把gen-csharp里面的代码拷贝到新项目中
- 引用Thrift项目
- 编译生成 ThriftHbaseClient.dll
Hbase C#客户端测试
- 新建一个控制台项目
- 引用ThriftHbaseClient和Thrift项目
- 在main函数插入下面代码
Thrift 版本:
TTransport transport = null;
try
{
//实例化Socket连接
transport = new TSocket("192.168.1.10", );
//实例化一个协议对象
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:\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();
Thrift2 版本:
TTransport transport = null;
try
{
transport = new TSocket("192.168.1.10", );
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:\n{0}", Encoding.UTF8.GetString(reslut.Row));
foreach (var k in reslut.ColumnValues)
{
Console.WriteLine("Family:Qualifier:" + "\n" + 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
使用C#通过Thrift访问HBase的更多相关文章
- PHP通过Thrift操作Hbase
PHP通过Thrift操作Hbase HBase是一个开源的NoSQL产品,它是实现了Google BigTable论文的一个开源产品,和Hadoop和HDFS一起,可用来存储和处理海量col ...
- 使用C#和Thrift来访问Hbase实例
今天试着用C#和Thrift来访问Hbase,主要参考了博客园上的这篇文章.查了Thrift,Hbase的资料,结合博客园的这篇文章,终于搞好了.期间经历了不少弯路,下面我尽量详细的记录下来,免得大家 ...
- HBase(一): c#访问hbase组件开发
HDP2.4安装系列介绍了通过ambari创建hbase集群的过程,但工作中一直采用.net的技术路线,如何去访问基于Java搞的Hbase呢? Hbase提供基于Java的本地API访问,同时扩展了 ...
- windows平台下用C#访问HBase
Hadoop中的HBase有多种数据访问方式,ubuntu里可以用hbase shell查看操作hbase数据库,但windows平台下需要用thrift对它进行访问. 例如hadoop安装在/usr ...
- Nodejs通过Thrift操作hbase卡住原因分析及与javascript的垃圾回收机制的关系
在最近使用Nodejs通过Thrift操作hbase的时候写了个脚本,不断发送http请求,从而取得hbase下所需的数据,但是在run的过程中for循环并没有执行完全,在执行一部分后会卡住,就再也进 ...
- CDH 6.0.1 版本 默认配置下 HUE | happybase 无法访问 Hbase 的问题
第一个问题 HUE 无法直接连接到 HBase 在默认配置下 CDH 6.0.1 版本下的 HBase2.0 使用了默认配置 hbase.regionserver.thrift.compact = T ...
- PHP通过thrift2访问HBASE
前一段时间需要在网页上显示HBASE查询的结果,考虑用PHP来实现,在网上搜了一下,普遍都是用thrift作为接口来实现的. 参考博文: http://www.cnblogs.com/scotom ...
- HBase(二): c#访问HBase之股票行情Demo
上一章完成了c#访问hbase的sdk封装,接下来以一个具体Demo对sdk进行测试验证.场景:每5秒抓取指定股票列表的实时价格波动行情,数据下载后,一方面实时刷新UI界面,另一方面将数据放入到在内存 ...
- 通过Thrift访问HDFS分布式文件系统的性能瓶颈分析
通过Thrift访问HDFS分布式文件系统的性能瓶颈分析 引言 Hadoop提供的HDFS布式文件存储系统,提供了基于thrift的客户端访问支持,但是因为Thrift自身的访问特点,在高并发的访问情 ...
随机推荐
- 【数据结构和算法】 O(1)时间取得栈中的最大 / 最小元素值
常数时间取得栈中的元素最大值和最小值,我们可以想到当push的时候比较一下,如果待push元素值小于栈顶元素,则更新min值,最大值亦然. 这样有个问题就是当pop的时候,就没了最大最小值. 于是上网 ...
- andriod的简单用法2
1.在Activity中使用menu //创建菜单项 public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this ...
- 【暑假】[基本数据结构]根据in_order与post_order构树
Tree Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Submit Status Des ...
- Tkinter教程之Radiobutton篇
本文转载自:http://blog.csdn.net/jcodeer/article/details/1811308 #Tkinter教程之Radiobutton篇#Radiobutton为单选按钮, ...
- JEE , EJB概念深入概括
说起EJB,不得不提JEE,java EE 英文全称为:java Enterprise Edition企业级应用的软件架构,是一种思想,也是一种规范,方便从事这方面的开发者以及开发厂商进行规范性的开发 ...
- WINRAR评估版本弹出框消除
网上有很多WINRAR评估版本,这些版本下载安装了之后总会有些广告弹出,让人很烦恼,现在教大家一个方法消除这些弹出框. 复制以下代码: RAR registration data SeVeN U ...
- Spring Auto scanning components
Normally you declare all the beans or components in XML bean configuration file, so that Spring cont ...
- [iOS微博项目 - 2.1] - 获得新浪授权接口
A.如何获得新浪的授权接口 登陆新浪的开放平台 注册新浪账号 创建应用 获得应用id和请求地址 查阅相关API 关联需要进行测试的账号 1.登陆开放平台 http://open.weibo.com ...
- Session,Cookie 和local storage的区别
以前从没有听说过local storage, 在网上查了一些资料,得到如下结论 从存储位置看,分为服务器端存储和客户端存储两种 服务器端: session 浏览器端: cookie, localSto ...
- Check Box 用法
void CMyDlg::OnInitDialog() //Check1 初始化为选中状态 void CMyDlg::OnInitDialog() { CDialog::OnInitDialog(); ...