从C#连接到Accumulo



我是Accumulo的新手。我需要通过C#从远程Accumulo读取/写入数据。我找到的C#的唯一代码示例/文档是-Accumulo createBatchScanner范围未按预期工作

我试图在Mac上的Xamarin Studio中编译代码
我遇到的问题是这条线:

AccumuloProxy.Client client = new AccumuloProxy.Client(protocol);

错误CS0246:使用指令的类型或命名空间名称AccumuloProxy' could not be found. Are you missing org.apache.accumulo.proxy.frift?(CS0246)(AccumuloIntegratorPrototype)

在哪里可以找到要添加到与AccumuloProxy客户端相关的CSharp项目的DLL?有没有一种方法我可以生成相同的?

这里有一个代码片段:

namespace AccumuloIntegratorPrototype
{
    class MainClass
    {
        static byte[] GetBytes(string str)
        {
            return Encoding.ASCII.GetBytes(str);
        }
        static string GetString(byte[] bytes)
        {
            return Encoding.ASCII.GetString(bytes);
        }
        public static void Main (string[] args)
        {
            try
            {
                /** connect **/
                TTransport transport = new TSocket("xxx.xx.x.xx", 42424);
                transport = new TFramedTransport(transport);
                TCompactProtocol protocol = new TCompactProtocol(transport);
                transport.Open();
                AccumuloProxy.Client client = new AccumuloProxy.Client(protocol);

感谢所有的指针
能够完成我的项目
这些是我的笔记。

A。版本:
Accumulo 1.5
节俭0.90
Mono 3.2.5

B。用于从C#连接到Accumulo的策略/选项:
Accumulo代理API

C。带有C#绑定的Accumulo代理:
在运行Accumulo
的节点上执行了以下操作1.已安装Mono 3.2.5
2.安装节约0.90
3.配置的Accumulo代理服务
修改了文件$ACCUMULO_HOME/proxy/proxy.properties
具体更新了实例名称,并且zookeeper
4.启动代理守护程序-

${ACCUMULO_HOME}/bin/accumulo proxy -p ${ACCUMULO_HOME}/proxy/proxy.properties

5.使用proxy.frift IDL文件
生成c#绑定

thrift --gen csharp $ACCUMULO_HOME/proxy/thrift/proxy.thrift

这导致在${ACCUMULO_HOME}/proxy/scrift/
下创建了一个名为gen-csharp的目录6.在下面的D部分中,C#项目中需要gen-csharp下的文件
7.Thrift.dll,也是必需的。

D。C#项目-Accumulo客户端:
1.创建了类型库的项目
2.在上面的步骤C5中将gen csharp下的文件添加到库中
3.添加了对节俭.dll的引用
4.建立图书馆

E。从C#连接到Accumulo
在读取/写入Accumulo的C#项目中,
1.添加了引用-frift.dll
2.添加了对
上面D部分中构建的库的引用3.在Accumulo服务器上,启动代理(请参阅上面的步骤C4)

以下是一些示例代码,用于读取数据并尝试此功能

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

namespace AccumuloIntegratorPrototype
{
class MainClass
{
    static byte[] GetBytes(string str)
    {
        return Encoding.ASCII.GetBytes(str);
    }

    static string GetString(byte[] bytes)
    {
        return Encoding.ASCII.GetString(bytes);
    }
    public static void Main (string[] args)
    {
        try
        {
            String accumuloProxyServerIP = "xxx.xxx.x.xx";//IP
            int accumuloProxyServerPort = 42424;//Port Number
            TTransport transport = new TSocket(accumuloProxyServerIP, accumuloProxyServerPort);
            transport = new TFramedTransport(transport);
            TCompactProtocol protocol = new TCompactProtocol(transport);
            transport.Open();
            String principal = "root";//Application ID
            Dictionary<string, string> passwd = new Dictionary<string,string>();
            passwd.Add("password", "xxxxx");//Password
            AccumuloProxy.Client client = new AccumuloProxy.Client(protocol);
            byte[] loginToken = client.login(principal, passwd);//Login token

            //{{
            //Read a range of rows from Accumulo
            var bScanner = new BatchScanOptions();
            Range range = new Range();
            range.Start = new Key();
            range.Start.Row = GetBytes("d001");
            //Need the  only if you need to get a single row back
            //Otherwise, its not needed
            range.Stop = new Key();
            range.Stop.Row = GetBytes("d001");
            bScanner.Ranges = new List<Range>();
            bScanner.Ranges.Add(range);
            String scanId = client.createBatchScanner(loginToken, "departments", bScanner);

            var more = true;
            while (more)
            {
                var scan = client.nextK(scanId, 10);
                more = scan.More;
                foreach (var entry in scan.Results)
                {
                    Console.WriteLine("Row = " + GetString(entry.Key.Row));
                    Console.WriteLine("{0} {1}:{2} [{3}]  {4}    {5}", GetString(entry.Key.Row), GetString(entry.Key.ColFamily), GetString(entry.Key.ColQualifier), GetString(entry.Key.ColVisibility), GetString(entry.Value),(long)entry.Key.Timestamp);
                }
            }
            client.closeScanner(scanId);
            client.Dispose();
            transport.Close();
            }catch (Exception e)
            {
                Console.WriteLine(e);
            }
        //}}

    }
}
}

将Thrift添加到C#项目需要两个步骤:

  1. 添加通过Thrift编译器生成的C#代码
  2. 构建Thrift.DLL并将其添加为项目的引用。或者,也可以将代码链接到您的项目中,但不建议这样做

步骤1的C#代码是从Thrift IDL文件生成的,该文件通常是项目的一部分。在您的案例中,IDL文件位于Accumulo树中的proxy/src/main/rift下。

Thrift编译器和库可以从http://thrift.apache.org.请注意,有些项目使用的是Apache Thrift的旧版本,它不一定是最新的稳定版本。正如elserj在评论中提到的,Accumulo 1.4.x取决于Thrift 0.6.1,Accumulo1.5.x及更高版本取决于Threft 0.9.0。

相关内容

  • 没有找到相关文章

最新更新