天天看点

使用 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 项目的类库解决方案

使用 C# 访问增强版 Hbase(Lindorm)
thrift 0.12.0 tar 包下载好之后,需要解压缩,接着到路径

thrift-0.12.0\thrift-0.12.0\lib\csharp\src

下,可以看到我们需要的文件
使用 C# 访问增强版 Hbase(Lindorm)
把图中圈出来的文件复制,然后跑到 visual studio 刚刚创建好的解决方案里,直接选中右边的解决方案名称然后粘贴即可,完成之后如下图:
使用 C# 访问增强版 Hbase(Lindorm)
这时候,我们还需要添加一些依赖。选中引用,右键点添加引用,在程序集里面找到 System.Web 进行添加
使用 C# 访问增强版 Hbase(Lindorm)
完成之后,即可选中解决方案,右键点生成,即可生成一个 aaa.dll 的文件,后面我们会需要依赖这个 aaa.dll
使用 C# 访问增强版 Hbase(Lindorm)
再通过链接 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 的文件夹

使用 C# 访问增强版 Hbase(Lindorm)
这时候,重复上面的步骤,再新建一个 .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);
            }
        }
    }
}           

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

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

需要注意以下 2 点:

  1. 替换代码中的 url 部分,换成你自己的实例对应的公网连接地址
  2. 参考文档,对你需要进行访问的实例开通白名单和公网访问地址 https://help.aliyun.com/document_detail/119565.html?spm=a2c4g.11186623.6.560.1de042ddV8UbdR

继续阅读