HIVE通信数据包协议解析

HIVE通信数据包协议解析:

HIVE使用两种通信方式,一种是Thrift提供的二进制通信,使用协议为TBinaryProtocol

另外还可以使用Http通信,就是在TBinaryProtocol之前加上了http头。只要在hive-site.xml设置属性

hive.server2.transport.mode – 默认值为binary(TCP),可选值HTTP。

 

<property>

 <name>hive.server2.transport.mode</name>

 <value>http</value>

 <description>Server transport mode. "binary" or"http".</description>

</property>

<property>

<name>hive.server2.enable.doAs</name>

<value>false</value>

<description>

Setting this property to true will have hiveserver2 execute

hive operations as the user making the calls toit.

</description>

Binary类型 在Thrift中称为TBinaryProtocol,协议的字段结构和报文结构如下

 

 

首先给出一个ENUM,定义的是数据类型对应的编号

enum TType {

 T_INVALID = -1,

 T_STOP = 0,

 T_VOID = 1,

 T_BOOL = 2,

 T_BYTE = 3,

 T_I08 = 3,

 T_I16 = 6,

 T_I32 = 8,

 T_U64 = 9,

 T_I64 = 10,

 T_DOUBLE = 4,

 T_STRING = 11,

 T_UTF7 = 11,

 T_STRUCT = 12,

 T_MAP = 13,

 T_SET = 14,

 T_LIST = 15,

 T_UTF8 = 16,

 T_UTF16 = 17

};

 

接下来用一个实际报文举例说明下报文的具体构成。

Thrift二进制协议报文,分为4种

对严格的thrift消息,必须包含32为版本信息。

  若有32位版本信息,函数调用(请求:1,响应:2,异常:3,无返回值的请求:4)被包含到32位版本中,不独立出现。

  计算方法:

  32位版本 = 0x8001000 & 函数调用

  计算后,请求报文的32位版本值为 0x80010001;响应报文的32为版本值为 0x80010002;异常报文的32位版本值为 0x80010003;

若没有32位版本信息时,函数调用(请求:1,响应:2,异常:3,无返回值的请求:4)独立出现在消息报文中。

 

 

消息(函数)类型:

  表示方式一:四个字节的版本(含调用类型),四个字节的消息名称长度,消息名称,四个字节的流水号,消息负载数据的值,一个字节的结束标记。

  表示方式二:四个字节的消息名称长度,消息名称,一个字节调用类型,四个字节的流水号,消息负载数据的值,一个字节的结束标记。

 

我们使用的Hive采取的是严格正规的表示方式一,包含着32位的版本信息

 

在客户端中输入查询信息:

select sin_number from employee_hr;

使用wireshark抓包,可以找到如下报文:

 

协议包头,4字节,表示后面报文长度 BE = 190字节

 

四字节的版本信息+调用类型(报文类型)

80 01表示为32位版本  00 01代表为有返回值的请求报文,符合之前输入的查询命令

 

四字节的消息长度,10 = 16 后面有16字节的长度信息,紧跟着版本信息和调用类型的是请求调用到的函数名,本例子中就是ExecuteStatement  16字节

 

之后是4字节的流水号,或者说报文序号,相当于mysql协议报文当中的number of fields

即当前报文在本次TCP会话当中的序号

 

接下来就是消息参数了,根据调用函数的不同,这里会有所不同,当前例子分析如下:

 

 

0C 1字节的字段类型  0C=12 根据前面ENUM得出 是struct类型,00 01是参数的序号,这是函数的第一个参数,将这个结构记录为结构1

接下来跟着的是此结构中的字段类型

00 01表示这是结构1当中的第一个字段,0C表示第一个字段仍然是一个结构,标记它为结构2

 

0001表示是结构2的第一个字段, 0C表示字段类型为结构,标记此结构为结构3

 

0001 表示是结构3的第一个字段,0B = 11,表示这是一个string类型字段

0b0001后跟着的是4字节的长度信息  00 00 00 10 表示string长度为16字节

 

16字节之后结构3字段1结束,0B 00 02表示结构3的字段2类型为string

后面跟着4字节长度信息 00 00 00 10 表示string长度为16字节

 

 

16字节结束后是 00 00 0B 由前面说的协议结构可以知道,00  一个字节代表结构3结束标记,第二个00 表示结构2结束

 

接下来 00 0B 00 02 表示为结构1的第二个字段,类型为string

之后4字节长度信息 00 00 00 5C 换算10进制为92

接着92字节的string内容

如果对照右边内容看这92字节,就可以知道内容是查询语句

 

02 00 04 表示这里是结构1的字段4 类型为bool

接下来1字节的消息内容 01 表示true

然后1字节的00 表示结构1结束

最后1字节的00 表示整个请求报文结束。

 

 

下面大致分析下上述请求报文的应答报文

 

 

根据红框和红线顺序依次为

 

109字节报文长度

32位版本 应答报文

16字节长度信息

函数名字 ExecuteStatement

序号67

0号参数 类型结构 结构1

结构1第一字段结构2

结构2第一字段 32位int 4个字节

00结束符,结束结构2

结构1 第二字段结构3

结构3 第一字段结构4

结构4 第一字段字符串,长度16

结构4 第二字段字符串,长度16

00结束符,结束结构4

结构3 第二字段 32位int 4个字节

结构3 第三字段 bool型 1个字节

00结束符,结束结构3

00结束符,结束结构1

00结束符,结束报文

 

 

 

 

HTTP传输模式

在hive-site.xml文件当中按照配置设定好

在beeline中使用如下命令连接HTTP服务模式的hiveserver2

!connectjdbc:hive2://192.168.6.56:10001/default;transportMode=http;httpPath=cliservice

报文如下

就是比二进制模式下多了一层http协议头

thrift使用的仍然是TBinaryProtocol协议,因此对thrift部分的解析就不再重复了。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值