gpt4 book ai didi

javascript - Hive - Thrift - readMessageBegin 中缺少版本,旧客户端?

转载 作者:可可西里 更新时间:2023-11-01 16:07:05 25 4
gpt4 key购买 nike

你好,我正在尝试构建一个 nodejs 客户端来使用 thrift 查询我的 hive 数据库,但我遇到了一个奇怪的问题......我已经用 thrift 生成了我的 nodejs 客户端 API (thrift -r -- gen js:node TCLIService.thrift TCLIService 是定义 Hive 服务的节俭文件)现在我尝试连接到 Hive 但我的 OpenSession 正在等待中......也许我没有做正确的调用但我不在网上找不到任何最新的东西(每个 thrift/node/hive 项目都有 4 或 5 年的历史)。你能看看我做错了吗?谢谢

TCLIService.thrift :

// OpenSession()
//
// Open a session (connection) on the server against
// which operations may be executed.
struct TOpenSessionReq {
// The version of the HiveServer2 protocol that the client is using.
1: required TProtocolVersion client_protocol = TProtocolVersion.HIVE_CLI_SERVICE_PROTOCOL_V8

// Username and password for authentication.
// Depending on the authentication scheme being used,
// this information may instead be provided by a lower
// protocol layer, in which case these fields may be
// left unset.
2: optional string username
3: optional string password

// Configuration overlay which is applied when the session is
// first created.
4: optional map<string, string> configuration
}

service TCLIService {
TOpenSessionResp OpenSession(1:TOpenSessionReq req);
}

Node 代码: var sessionHandle = '';

function openSession(config) {
openSessReq = new ttypes.TOpenSessionReq();
openSessReq.client_protocol = ttypes.TProtocolVersion.HIVE_CLI_SERVICE_PROTOCOL_V8;
openSessReq.username = config.hiveUser;
openSessReq.password = config.hivePassword;
console.log("openSessReq = " + JSON.stringify(openSessReq));
console.log("Before OpenSession : sessionHandle = " + sessionHandle);
sessionHandle = client.OpenSession(openSessReq, function (err, result){
console.log('handler fired ... ');
if (err) {
console.error("error : " + err);
} else {
console.log("result : " + result);
}
});
console.log("After OpenSession : sessionHandle = " + sessionHandle);
}

connection.on('error', function(err) {
/*Error detected, print the error*/
console.error(err);
/*Close the program with error code*/
process.exit(1)
});

console.log('Error handler registered ...')

connection.on('connect', function(){
console.log('Connected ...');
/*Init session*/
console.log(client);
openSession(config);
}

我的输出如下:

CreateConnection DONE ...
Error handler registered ...
Connect handler registered ...
Connected ...
{ output:
TBufferedTransport {
defaultReadBufferSize: 1024,
writeBufferSize: 512,
inBuf: <Buffer e8 19 2b 03 00 00 00 00 b0 1a 2b 03 00 00 00 00 e8 18 2b 03 00 00 00 00 f0 18 2b 03 00 00 00 00 b0 19 2b 03 00 00 00 00 78 1a 2b 03 00 00 00 00 70 1d ... >,
readCursor: 0,
writeCursor: 0,
outBuffers: [],
outCount: 0,
onFlush: [Function],
client: [Circular] },
pClass: [Function: TBinaryProtocol],
_seqid: 0,
_reqs: {} }
openSessReq = {"client_protocol":7,"username":"root","password":"root","configuration":null}
Before OpenSession : sessionHandle =
After OpenSession : sessionHandle = undefined
^C

脚本无限期运行...如果我更改端口或关闭 HiveServer,我会遇到错误,因此连接正常,但我无法找出 openSession 不可用的原因!感谢您的帮助

编辑:我检查了我的日志,NOSASL 标识是问题所在……我已经解决了(我认为)这个问题,现在出现以下错误:

客户:

{ [Error: write EPIPE]
code: 'EPIPE',
errno: 'EPIPE',
syscall: 'write',
address: undefined }

服务器:

2016-02-17 13:36:37,152 ERROR org.apache.thrift.server.TThreadPoolServer: [HiveServer2-Handler-Pool: Thread-24]: Thrift error occurred during processing of message.
org.apache.thrift.protocol.TProtocolException: Missing version in readMessageBegin, old client?
at org.apache.thrift.protocol.TBinaryProtocol.readMessageBegin(TBinaryProtocol.java:228)
at org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:27)
at org.apache.hive.service.auth.TSetIpAddressProcessor.process(TSetIpAddressProcessor.java:56)
at org.apache.thrift.server.TThreadPoolServer$WorkerProcess.run(TThreadPoolServer.java:285)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)

我读到这个问题必须通过使用错误的协议(protocol)层来提出......我正在使用 TBinaryProtocol 这是一个问题吗?

最佳答案

我已经通过执行以下操作解决了我的问题:

使用蜂蜡检查我的 HiveServer2 的协议(protocol)版本并查询我的 HiveServer2(使用 Hue)并检查 HiveServer2 日志(我发现它是 Hive 0.15.0 的 HIVE_CLI_SERVICE_PROTOCOL_V7)

通过修改 hive-site.xml 在我的 HiveServer2 上启用 NOSASL 身份验证

关于javascript - Hive - Thrift - readMessageBegin 中缺少版本,旧客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35453288/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com