【问题标题】:Connecting to Accumulo from NodeJS从 NodeJS 连接到 Accumulo
【发布时间】:2014-02-13 22:06:55
【问题描述】:

我一直在尝试通过 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

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


更新:

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

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'}

请参阅下面的答案。

【问题讨论】:

  • 这基本上是两个问题,加上一个答案,都变成了一个问题。我建议把它清理干净。这样一来,它几乎没有帮助,也不一定适合 SO 的问答模型。

标签: node.js thrift thrift-protocol accumulo


【解决方案1】:

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

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

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

这是 Thrift here 的问题,显然已在 master 分支中修复。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 你有一个链接指向它说 Accumulo 只使用compact 协议而不能使用binary 协议的地方吗?看来您应该能够更改 proxy.properties 中的 protocolFactory 以使用 TBinaryProtocol
    • 不,抱歉。顺便说一句,你不喜欢我的回答是什么?
    • Accumulo 不要求您使用compact 协议。您可以通过更改代理属性文件来切换到使用TBinaryProtocol,因此目前没有可用于 NodeJS 的compact 协议支持不是问题。
    • 第一个问题的错误信息清楚地表明紧凑型已使用。但我从未说过,契约是必需的。如果你暗示,那不是我的错。
    猜你喜欢
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多