0

我在使用 WCF 和 hbase 时遇到了麻烦。我有一个使用 Python 编写的程序。该程序在后端使用 hbase 数据库。现在我需要一个 WCF 服务来编写 .NET 以连接到 hbase 并访问数据。有没有一起使用 WCF 和 hbase 的好方法?如果是这样,请给我一些有用的链接,或者请建议我如何从 WCF 调用一些 python 函数?因为我编写了一些 python 库,它们可以完成读取和写入 hbase 的工作。因此,如果我可以从 WCF 调用 python 方法,那么根本就没有问题。任何帮助都非常感谢。

谢谢,索赫尔。

4

1 回答 1

1

如果您想将 HBase 与 .NET 应用程序一起使用,您可以使用HBase Thrift API 。您可能想看看HBase sharp, HBase 的 C# 绑定。这是没有区域意识的简单节俭绑定。

除了 Thrift,HBase 还提供了Avro API也可以从 .NET 调用的。

这是 HBase sharp 项目提供的示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HBase.Thrift;
using Thrift.Protocol;
using Thrift.Transport;

namespace HBase.Example
{
    class Program
    {
        private static Hbase.Client _hbase;
        static byte[] table_name = Encoding.UTF8.GetBytes("vadim_test");
        static readonly byte[] ID = Encoding.UTF8.GetBytes("Id");
        static readonly byte[] NAME = Encoding.UTF8.GetBytes("Name");
        static int i = 0;

        static void Main(string[] args)
        {
            int port = 9090;

            string host = args.Length == 1 ? args[0] : "localhost";

            var socket = new TSocket(host, port);
            var transport = new TBufferedTransport(socket);
            var proto = new TBinaryProtocol(transport);
            _hbase = new Hbase.Client(proto);

            try
            {
                transport.Open();

                var names = _hbase.getTableNames();
                names.ForEach(msg => Console.WriteLine(Encoding.UTF8.GetString(msg)));

                CreateTable();
                Insert();
                Get();

                transport.Close();
            } catch(Exception e)
            {
                Console.Error.Write(e.Message);
            }
        }

        private static void Get()
        {
            var scanner = _hbase.scannerOpen(table_name, Guid.Empty.ToByteArray(),
                                             new List<byte[]>(){ID});
            for (var entry = _hbase.scannerGet(scanner); entry.Count > 0; entry = _hbase.scannerGet(scanner))
            {
                foreach (var rowResult in entry)
                {
                    Console.Write("{0} => ", new Guid(rowResult.Row));
                    var res = rowResult.Columns.Select(c => BitConverter.ToInt32(c.Value.Value, 0));
                    foreach (var cell in res)
                    {
                        Console.WriteLine("{0}", cell);
                    }
                }
            }
        }

        private static void Insert()
        {
            _hbase.mutateRows(table_name, new List<BatchMutation>()
            {
                new BatchMutation()
                {
                    Row = Guid.NewGuid().ToByteArray(),
                    Mutations = new List<Mutation> {
                        new Mutation{Column = ID, IsDelete = false, Value = BitConverter.GetBytes(i++) }
                    }
                },
                new BatchMutation()
                {
                    Row = Guid.NewGuid().ToByteArray(),
                    Mutations = new List<Mutation> {
                        new Mutation{Column = ID, IsDelete = false, Value = BitConverter.GetBytes(i++) }
                    }
                }
            });
        }

        private static void CreateTable()
        {
            _hbase.disableTable(table_name);
            _hbase.deleteTable(table_name);

            _hbase.createTable(
                table_name,
                new List<ColumnDescriptor>()
                    {
                        new ColumnDescriptor {Name = ID, InMemory = true},
                        new ColumnDescriptor {Name = NAME, InMemory = true}
                    }
                );
        }
    }
}

高温高压

于 2013-07-08T17:15:21.493 回答