如何与运行NONE身份验证的HiveServer2进行通信

时间:2013-05-15 13:45:20

标签: hive thrift sasl thrift-protocol

我正在尝试通过ruby TCPSocket与HiveServer2进行通信。根据Thrift SASL规范,我发送START消息,然后发送纯auth信息。 服务器返回COMPLETE状态,空载荷。它应该将challenge作为有效负载返回,但是返回一个空字符串。

START    = 0x01
OK       = 0x02
COMPLETE = 0x05

auth = 'PLAIN'
header = [START, auth.length].pack('cl>')

auth_string = ['anonymous'].pack('u')
auth_message = "[LOGIN] \u0000 #{auth_string} \u0000 #{auth_string}"
auth_header = [OK, auth_message.length].pack('cl>')

socket = TCPSocket.new localhost, 10000
socket.write header + auth
socket.write auth_header + auth_message

socket.read(5).unpack('cl>')
=> [5,0]

HiveServer2返回5状态为COMPLETE。 通过此套接字无法进一步通信,因为服务器不再返回任何内容。

我怀疑auth_message以错误的方式构建或其他错误。

有人能建议HiveServer2理解我的请求吗?

任何帮助将不胜感激。

UPD:Thrift SASL spec

UPD2:解决了! STARTTLS块应如下所示:

START    = 0x01
OK       = 0x02
COMPLETE = 0x05

auth = 'PLAIN'
header = [START, auth.length].pack('cl>')
auth_message = "[ANONYMOUS]\u0000anonymous\u0000anonymous"
auth_header = [OK, auth_message.length].pack('cl>')

socket = TCPSocket.new localhost, 10000
socket.write header + auth
socket.write auth_header + auth_message
socket.read(5).unpack('cl>')
=> [5,0]

从服务器收到COMPLETE状态后,我可以使用TCLIService :: Client与HiveServer2进行通信。只有一点需要注意:

  

对底层传输的所有写入必须以有效载荷数据的4字节长度为前缀,后跟有效载荷。所有读取都来自此运输   应该读取4字节长度的字,然后读取完整的字节数   由这个长度字指定。

1 个答案:

答案 0 :(得分:0)

尝试使用thrift gem并考虑https://github.com/dallasmarlow/hiveserver2而不是Ruby套接字。