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

Hive - Thrift - Missing version in readMessageBegin, old client?

你好,我正在尝试构建一个 nodejs 客户端来使用 thrift 查询我的 hive 数据库,但我遇到了一个奇怪的问题......我用 thrift 生成了我的 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);
}

节点代码: 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 有问题吗?

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

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

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

尝试检查你的环境的三个部分,默认情况下这三个部分都在同一个配置文件中(hive-site.xml):

  1. 传输模式 检查hive.server2.transport.mode,你必须在服务和客户端使用相同的模式。

  2. ssl 启用 检查hive.server2.use.SSL,你可以尝试关闭,确保与此配置无关。

  3. 授权 检查hive.server2.authentication,因为有几种(NONE,NOSASL,KERBEROS,LDAP,CUSTOM)的授权模式,确保你使用正确的。

PS。你可以尝试通过控制台连接到你的hs2,看看服务器是否有问题。