3

我一直在尝试通过 Thrift 代理从 NodeJS 连接到 Accumulo,但没有成功。

var thrift = require("thrift");
var AccumuloClient = require("./AccumuloProxy");

var transport = thrift.TFramedTransport;
var protocol = thrift.TBinaryProtocol;

var connection = thrift.createConnection("localhost", 42424, {
    transport: transport,
    protocol: protocol
});

var client = thrift.createClient(AccumuloClient, connection);

client.login("root", {'password': "password"});

当我尝试登录时,我得到

org.apache.thrift.protocol.TProtocolException: Expected protocol id ffffff82 but got ffffff80

有没有人能帮助我,让我知道我在这里做错了什么?


更新:

我修改protocolFactory了位于 Accumulo 中的 proxy.properties 文件中的行并重新启动了代理。

protocolFactory=org.apache.thrift.protocol.TBinaryProtocol$Factory

我执行了与上述相同的步骤,但在调用中添加了回调createClient

var login;
var client = thrift.createClient(AccumuloClient, connection, 
    function(err, success) { login = success });

这将填充登录变量。然后我尝试使用该登录变量来执行其他功能

client.listTables(login, function(a) { console.log(a) })

结果是

{name: 'TApplicationException', 
 type: 6,
 message: 'Internal error processing listTables'}

试图创建一个表

client.createTable(login, "testTable", 1, "", function(a) { console.log(a)})

结果是

{name: 'AccumuloSecurityException',
 msg: 'org.apache.accumulo.core.client.AccumuloSecurityException: Error SERIALIZATION_ERROR for user unknown - Unknown security exception'}

请参阅下面的答案。

4

2 回答 2

2

事实证明,问题的存在是因为处理了来自 Accumulo 的响应。在 AccumuloProxy.js 文件中,当接收并读取登录结果时AccumuloProxy_login_result.prototype.read,会将成功设置为this.success = input.readString()

readString()函数将使用编码进行Bufferand 调用。这导致字符显示不正确。toString()utf8

我修改了AccumuloProxy_login_result.prototype.read函数以设置成功,this.success = input.readBinary()以便Buffer返回 a 。这Buffer可以传递给其他函数调用,并且将从 Accumulo 返回正确的结果,而不是异常。

这是 Thrift 的一个问题,显然已在主分支中修复。

于 2014-02-12T18:22:34.460 回答
0

似乎Accumulo使用compact协议,而不是binary协议。看起来,目前还没有可用于 NodeJS 的紧凑协议支持。

请也看看这个 SO question。它处理 C#,但它仍然很有帮助。还有一些利用 RabbitMQ 或其他消息代理的解决方案,请参见此处

于 2014-02-10T18:12:01.587 回答