hive-thrift 代码浅析

使用代码版本:
apache-hive-2.1.1-src
thrift-0.10.0
thrift本身只是一个框架,自带一些库和例子以及一个自动生成代码的compiler
hive本身的bin实现推测主要是使用java

hive中cpp的自动生成代码在如下目录
apache-hive-2.1.1-src\service-rpc\src\gen\thrift\gen-cpp
thrift主要关注 TBinaryProtocol的实现部分,hive使用的协议就是这种。

因为hive的cpp源码当中没有函数入口点,所以自下向上看代码的调用关系。

用ExecuteStatement这个函数开始。 这是hive执行sql语句的函数
从它向下,可以见到是在逐层按照ExecuteStatement的参数结构往下调用read和write函数
// ExecuteStatement()
struct TExecuteStatementReq {
1: required TSessionHandle sessionHandle
2: required string statement
3: optional map<string, string> confOverlay
4: optional bool runAsync = false
5: optional i64 queryTimeout = 0
}
从这个函数向上,会是process_ExecuteStatement,其他函数类同,都会是process_xxx
继续向上,所有的process_xxx函数,都是在TCLIServiceProcessor类当中定义。
推测CPP client端具体的实现就是实例化TCLIServiceProcessor 给出要调用的函数名字,以及搭配此函数的参数,可以参考下面函数,in 和 out 的protocol指针,函数名字fname,seqid,和具体参数callContext
virtual bool dispatchCall(::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol* oprot, const std::string& fname, int32_t seqid, void* callContext);

server端监听端口,当收到对应的报文后。推测是首先进入一个
readMessagebegin()

但是实际上在hive当中看代码,readMessagebegin都是从各个执行函数调用的,比如ExecuteStatement-> recv_ExecuteStatement-> readMessageBegin
这里没有搞清楚。按照顺序应该是需要先readbegin 得到函数名,才能调下来。
在TBinaryProtocol.tcc中可以找到对应实现

上来readI32,这里往下似乎是从buff读东西,但是继续找,找不到读入buffer的地方了。
readI32的作用是读开头4字节,然后和掩码计算出版本号
然后是读出函数名,和包的seqid
接下来就可以根据函数名去逐层read了。

Hive解析的c_glib实现

从最低层到最上层,全部都是一个个结构嵌套。
最上层是TProtocol 和 TTransport
可以通过宏THRIFT_PROTOCOL , THRIFT_TRANSPORT来获取结构指针。
而具体的类型则由 下层的具体结构体来声明,比如protocol
ThriftProtocol * protocol = THRIFT_PROTOCOL(g_object_new(THRIFT_TYPE_BINARY_PROTOCOL, “transport”, transport, NULL));

g_object_new创建一个 TBinaryProtocol的结构指针,然后赋值给protocol
ThriftProtocolClass * pcls = (ThriftProtocolClass *)THRIFT_PROTOCOL_GET_CLASS(protocol);
pcls->read_message_begin(protocol, &name, &message_type, &seqid, &error);
通过自身的GET_CLASS宏,可以将从结构指针获取到 近似类定义的类结构(取了class的名字,实际上仍然是用struct实现),然后通过这个类结构的指针,可以调用初始化好的方法(read write 等等)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值