使用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 9099 start
启动Thrift2:
bin/hbase thrift2 -b HadoopMaster -p 9099 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.3.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", 9099); //实例化一个协议对象 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", 9099); 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
Keep it simple!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性