使用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自身的访问特点,在高并发的访问情 ...
随机推荐
- hdfs 数据块重分布 sbin/start-balancer.sh -threshold
数据块重分布sbin/start-balancer.sh -threshold <percentage of disk capacity>percentage of disk capa ...
- 《Genesis-3D开源游戏引擎-官方录制系列视频教程:基础操作篇》
注:本系列教程仅针对引擎编辑器:v1.2.2及以下版本 G3D基础操作 第一课<G3D编辑器初探> G3D编辑器介绍,依托于一个复杂场景,讲解了场景视图及其基本操作,属性面板和工具栏的 ...
- 为Hadoop配置Win8.1授时服务器
启动Windows服务,顺序如下: SSTPS(secure socket tunneling protocol service)服务 Telephony服务 Remote Access Connec ...
- https://github.com/mlzboy/spider-impl.git
Installation - pygit2 0.24.0 documentation Python 2.7, 3.2+ or PyPy 2.6+ (including the development ...
- AutoCAD.NET二次开发:创建自定义菜单(COM)
当我们要在CAD中创建自定菜单时,可以引用COM组件来实现. 下面是实现方式: 1.新建类库项目,并引用CAD目录(我这里用的是CAD2008)下的acdbmgd.dll.acmgd.dll,并将引用 ...
- MSXML读取XML中文
// QueryNodes.cpp : Defines the entry point for the console application. // #include <stdio.h> ...
- 关于ssh和ajax小小总结
我是相当的不专业,写给自己看.有什么错误的话,说出来将感激不尽. 有两种方法异步传输 1.通过json字符串: jsp中这么写: $.getJSON( "details_ajaxActio ...
- [转]javascript对联广告、漂浮广告封装类,多浏览器兼容
封装的JS方法: function $$(element){ if(arguments.length>1){ for(var i=0,elements=[],length=arguments.l ...
- 让div变得大方美观 bootstrap
<div class="panel panel-default "> <div class="panel-heading"> <h ...
- hadoop 关闭进程时报错no 进程 to stop
前两天和朋友李天王吃饭的时候,聊到了一个hadoop的运维的很简单问题,感觉很有意思,以前也没有注意过,现在加以重现和整理. 感谢李天王的分享.... 翻看了yarn-deamon.sh st ...