你好,我正在构建一个nodejs客户端,用于使用节俭查询我的蜂巢数据库,但是我面临着一个奇怪的问题.我已经用节俭生成了nodejs客户端API (thrift -r --gen js:node TCLIService.thrift和TCLIService是定义Hive服务的节俭文件),现在我尝试连接到Hive,但是我的OpenSession正在挂起.也许我没有做正确的调用,但我没有在网上找到任何最新的东西(每一个节俭/节点/蜂巢项目都有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);
}Nodejs代码: 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)我读到这个问题必须通过使用错误的协议层来解决.我在用TBinaryProtocol,这是个问题吗?
发布于 2016-02-17 16:44:10
我通过以下操作解决了我的问题:
使用beewax检查我的HiveServer2的协议版本,查询我的HiveServer2 (使用Hue)和检查HiveServer2日志(我发现它是Hive0.15.0的HIVE_CLI_SERVICE_PROTOCOL_V7 )
通过修改hivesite.xml在我的HiveServer2上启用NOSASL身份验证
发布于 2017-09-21 09:09:40
尝试检查环境的三个部分,默认情况下,这三个部分都位于相同的配置文件(hive-site.xml)中:
hive.server2.transport.mode,您必须在服务和客户端中使用相同的模式。hive.server2.use.SSL,您可以尝试关闭以确保与此配置无关。hive.server2.authentication,因为有几种(NONE,NOSASL,KERBEROS,LDAP,定制)的auth模式,所以请确保使用正确的一种。PS。您可以尝试通过控制台连接到您的hs2,并查看服务器是否有问题。
https://stackoverflow.com/questions/35453288
复制相似问题