使用 C# 访问增强版 Hbase(Lindorm)

简介: 如何使用 C# 访问增强版 Hbase(Lindorm)

首先通过链接 http://archive.apache.org/dist/thrift/0.12.0/thrift-0.12.0.tar.gz 下载 thrift 0.12.0 版本的 tar 包

通过 visual studio IDE 创建一个 .net framework 项目的类库解决方案
image.png
thrift 0.12.0 tar 包下载好之后,需要解压缩,接着到路径 thrift-0.12.0\thrift-0.12.0\lib\csharp\src 下,可以看到我们需要的文件
image.png

把图中圈出来的文件复制,然后跑到 visual studio 刚刚创建好的解决方案里,直接选中右边的解决方案名称然后粘贴即可,完成之后如下图:
image.png
这时候,我们还需要添加一些依赖。选中引用,右键点添加引用,在程序集里面找到 System.Web 进行添加
image.png
完成之后,即可选中解决方案,右键点生成,即可生成一个 aaa.dll 的文件,后面我们会需要依赖这个 aaa.dll
image.png

再通过链接 http://archive.apache.org/dist/thrift/0.12.0/thrift-0.12.0.exe 下载 thrift 的可执行文件,以及链接 https://hbaseuepublic.oss-cn-beijing.aliyuncs.com/hbase.thrift?spm=a2c4g.11186623.2.26.1de042ddV8UbdR&file=hbase.thrift 下载 hbase 的 thrift 定义文件。

下载完成后,打开命令行,跳转到对应的目录下,执行 thrift-0.12.0.exe --gen csharp hbase.thrift,这个命令会生成一个 gen-csharp 的文件夹
image.png
这时候,重复上面的步骤,再新建一个 .net framework 的类库解决方案,把 gen-csharp 文件夹下面的文件都拷贝到该解决方案下面,并且把上一步生成的 aaa.dll 在引用处进行添加,这时便能生成一个 bbb.dll 文件。(aaa.dll 在上一个解决方案对应目录下的 \bin\Debug 下能找到)

生成 aaa.dll 和 bbb.dll 之后,便能够编写简单的 demo 进行访问了。还是通过 visual studio 新建一个 .net framework 的控制台应用,在引用处,添加 aaa.dll 和 bbb.dll。下面我给出简单的 demo 代码,大致做了以下几件事:

  1. 初始化客户端
  2. 创建 namespace
  3. 创建 table
  4. put 一条数据
  5. get 一条数据并且打印出来
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Thrift.Protocol;
using Thrift.Transport;

namespace hbaseDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Uri uri = new Uri("http://ld-bp1u7jrc0818gtyql-proxy-hbaseue-pub.hbaseue.rds.aliyuncs.com:9190");
                THttpClient transport = new THttpClient(uri);
                IDictionary<string, string> header = transport.CustomHeaders;
                header.Add("ACCESSKEYID", "root");
                header.Add("ACCESSSIGNATURE", "root");
                TProtocol tProtocol = new TBinaryProtocol(transport);
                var client = new THBaseService.Client(tProtocol);
                transport.Open();

                String ns = "guchi5";
                client.createNamespace(new TNamespaceDescriptor(ns));

                byte[] tableNameBytes = Encoding.UTF8.GetBytes("tablename");
                byte[] familyByte = Encoding.UTF8.GetBytes("f");
                TTableName tTableName = new TTableName(tableNameBytes);
                tTableName.Ns = Encoding.UTF8.GetBytes(ns);
                TTableDescriptor tTableDescriptor = new TTableDescriptor(tTableName);
                List<TColumnFamilyDescriptor> columns = new List<TColumnFamilyDescriptor>();
                columns.Add(new TColumnFamilyDescriptor(Encoding.UTF8.GetBytes("f")));
                tTableDescriptor.Columns = columns;
                client.createTable(tTableDescriptor, null);

                byte[] rowByte = Encoding.UTF8.GetBytes("row");
                List<TColumnValue> list = new List<TColumnValue>();
                list.Add(new TColumnValue(familyByte, Encoding.UTF8.GetBytes("q1"), Encoding.UTF8.GetBytes("value-guchi")));
                string namespaceAndTableName = ns + ":tablename";
                byte[] namespaceAndTableNameBytes = Encoding.UTF8.GetBytes(namespaceAndTableName);
                client.put(namespaceAndTableNameBytes, new TPut(rowByte, list));

                TGet tget = new TGet(rowByte);
                TResult result = client.get(namespaceAndTableNameBytes, tget);
                Console.WriteLine("RowKey:\n{0}", Encoding.UTF8.GetString(result.Row));
                //打印Qualifier和对应的Value
                foreach (var k in result.ColumnValues)
                {
                    Console.WriteLine("Family:Qualifier:" + "\n" + Encoding.UTF8.GetString(k.Qualifier));
                    Console.WriteLine("Value:" + Encoding.UTF8.GetString(k.Value));
                }
                Console.WriteLine("done");
            } catch (Exception e)
            {
                System.Console.WriteLine(e);
            }
        }
    }
}

运行上述代码能看到以下输出
image.png

需要注意以下 2 点:

  1. 替换代码中的 url 部分,换成你自己的实例对应的公网连接地址
  2. 参考文档,对你需要进行访问的实例开通白名单和公网访问地址 https://help.aliyun.com/document_detail/119565.html?spm=a2c4g.11186623.6.560.1de042ddV8UbdR
相关实践学习
lindorm多模间数据无缝流转
展现了Lindorm多模融合能力——用kafka API写入,无缝流转在各引擎内进行数据存储和计算的实验。
云数据库HBase版使用教程
&nbsp; 相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情:&nbsp;https://cn.aliyun.com/product/hbase &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
6月前
|
C#
C# DataTable不能通过已删除的行访问该行的信息
C# DataTable不能通过已删除的行访问该行的信息
|
PyTorch API C#
【Python+C#】手把手搭建基于Hugging Face模型的离线翻译系统,并通过C#代码进行访问
目前翻译都是在线的,要在C#开发的程序上做一个可以实时翻译的功能,好像不是那么好做。而且大多数处于局域网内,所以访问在线的api也显得比较尴尬。于是,就有了以下这篇文章,自己搭建一套简单的离线翻译系统。以下内容采用python提供基础翻译服务+ C#访问服务的功能,欢迎围观。
1095 0
【Python+C#】手把手搭建基于Hugging Face模型的离线翻译系统,并通过C#代码进行访问
|
2月前
|
SQL 存储 关系型数据库
C#一分钟浅谈:使用 ADO.NET 进行数据库访问
【9月更文挑战第3天】在.NET开发中,与数据库交互至关重要。ADO.NET是Microsoft提供的用于访问关系型数据库的类库,包含连接数据库、执行SQL命令等功能。本文从基础入手,介绍如何使用ADO.NET进行数据库访问,并提供示例代码,同时讨论常见问题及其解决方案,如连接字符串错误、SQL注入风险和资源泄露等,帮助开发者更好地利用ADO.NET提升应用的安全性和稳定性。
264 6
|
3月前
|
缓存 NoSQL Redis
【Azure Redis 缓存】C#程序是否有对应的方式来优化并缩短由于 Redis 维护造成的不可访问的时间
【Azure Redis 缓存】C#程序是否有对应的方式来优化并缩短由于 Redis 维护造成的不可访问的时间
|
6月前
|
JavaScript 前端开发 C#
C# webbrowser控件设置代理IP访问网站
C# webbrowser控件设置代理IP访问网站
386 5
|
6月前
|
程序员 C#
C# 面向对象编程进阶:构造函数详解与访问修饰符应用
构造函数是一种特殊的方法,用于初始化对象。构造函数的优势在于,在创建类的对象时调用它。它可以用于为字段设置初始值
70 1
|
6月前
|
分布式计算 分布式数据库 API
Spark与HBase的集成与数据访问
Spark与HBase的集成与数据访问
|
6月前
|
存储 分布式计算 Hadoop
HBase的数据访问是如何进行的?
HBase的数据访问是如何进行的?
75 0
C#访问修饰符
C#访问修饰符
51 0
C#视频—访问修饰符
C#视频—访问修饰符