使用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自身的访问特点,在高并发的访问情 ...
随机推荐
- git 记录
在官网有详细的教程http://git-scm.com/book/zh/%E8%B5%B7%E6%AD%A5 查看分支和日志的两个工具:gitk 和 tig ,两个都有 --all 参数,可以查看所有 ...
- HDU5780 gcd 欧拉函数
http://acm.hdu.edu.cn/showproblem.php?pid=5780 BC #85 1005 思路: 首先原式化简:x^gcd(a,b)−1 也就是求n内,(公约数是i的 ...
- Chrome多线程模型
为什么使用多线程? Chrome的多线程模型主要解决什么问题? 如何实现该问题的解决? 1. 解决问题 Chrome有很多线程,这是为了保持UI线程(主线程)的高响应度,防止被其他费时的操作阻碍从而影 ...
- B树在数据库索引中的应用剖析
引言 关于数据库索引,google一个oracle index,mysql index总 有大量的结果,其中很多的使用方法推荐,**索引之n条经典建议云云.笔者认为,较之借鉴,在搞清楚了自己的需求的基 ...
- POJ 1251 && HDU 1301 Jungle Roads (最小生成树)
Jungle Roads 题目链接: http://acm.hust.edu.cn/vjudge/contest/124434#problem/A http://acm.hust.edu.cn/vju ...
- POJ3278http://poj.org/problem?id=3278
http://poj.org/problem?id=3278 题目大意: m,n两个数m可+1, -1, *2变成n,需要经过几步 #include<stdio.h> #include&l ...
- WebView自适应并嵌套在ScrollView里
大致思路:通过流的形式把网页抓取下来,然后对webView进行设置. 1.对webView进行设置 web.setWebViewClient(new WebViewClient() { @Overri ...
- ADO.NET 快速入门(九):使用关系型数据
DataSet 可以包含非关联表,也可以包含关联表.你可以把 DataSet 想象成一个文档数据.事实上,除了 DataSet 是基于层级模型的,其它和 XML 数据文档是一样的.由于数据通常存储在关 ...
- Flex “跑马灯”效果(自定义“跑马灯”控件)
自定义类(BroadCastMarquee.as): package marquee { import flash.events.MouseEvent; import flash.events.Tim ...
- 【转】makefile语法规则
1.源程序的编译 在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器. 下面我们以一个实例来说明如何使用gcc编译器. 假设我们有下面一个非常简单的 ...