感谢大家的指点。
能够完成我的项目。
这些是我的笔记。
A. 版本:
Accumulo 1.5
Thrift 0.90
Mono 3.2.5
B. 用于从 C# 连接到 Accumulo 的策略/选项:
Accumulo 代理 API
C. Accumulo Proxy with C# bindings:
在运行Accumulo
1.安装Mono 3.2.5
2.安装Thrift 0.90
3.配置Accumulo代理服务的节点上执行以下操作
修改文件$ACCUMULO_HOME/proxy/proxy.properties;
专门更新了实例名,和zookeeper
4.启动了代理守护进程——
${ACCUMULO_HOME}/bin/accumulo proxy -p ${ACCUMULO_HOME}/proxy/proxy.properties
5.生成c#绑定,使用proxy.thrift IDL文件
thrift --gen csharp $ACCUMULO_HOME/proxy/thrift/proxy.thrift
这导致在 ${ACCUMULO_HOME}/proxy/thrift/
6 下创建了一个名为 gen-csharp 的目录。C# 项目中需要 gen-csharp 下的文件,在下面的 D 节中。
7. Thrift.dll,也是需要的。
D. C# 项目 - Accumulo 客户端:
1. 创建了一个类型库的项目。
2. 将上述步骤 C5 中 gen-csharp 下的文件添加到库中
3. 添加对 thrift.dll 的引用
4. 构建库
E. 从 C# 连接到 Accumulo
在读取/写入 Accumulo 的 C# 项目中,
1. 添加了引用 - thrift.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 \0 only if you need to get a single row back
//Otherwise, its not needed
range.Stop = new Key();
range.Stop.Row = GetBytes("d001\0");
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);
}
//}}
}
}
}