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

誰かが私を助けて、私がここで間違っていることを教えてくれますか?


アップデート:

protocolFactoryAccumulo にある 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

aが返さAccumuloProxy_login_result.prototype.readれるように成功を設定するように関数を変更しました。これは他の関数呼び出しに渡すことができ、例外ではなく Accumulo から正しい結果が返されます。this.success = input.readBinary()BufferBuffer

これは Thrift の問題としてここに入れられ、master ブランチで修正されたようです。

于 2014-02-12T18:22:34.460 に答える
0

Accumulo はcompactプロトコルではなくプロトコルを使用しているようbinaryです。また、現在 NodeJS で利用できるコンパクトなプロトコル サポートはないようです。

このSOの質問もご覧ください。C# を扱っていますが、それでも役立つ場合があります。RabbitMQ やその他のメッセージ ブローカーを利用したソリューションもいくつかあります。こちら を参照してください

于 2014-02-10T18:12:01.587 に答える