golang链接hive

hive提供以下几种交互方式:

1、cli:是Command Line Interface 的缩写,是Hive的命令行界面,用的比较多,是默认服务,直接可以在命令行里使用

2、hiveserver/hiveserver2:这个可以让Hive以提供Thrift服务的服务器形式来运行,可以允许许多个不同语言编写的客户端进行通信,使用需要启动HiveServer服务以和客户端联系,我们可以通过设置HIVE_PORT环境变量来设置服务器所监听的端口,在默认情况下,端口号为10000,这个可以通过以下方式来启动Hiverserver2:

hive --service hiveserver2 -p 10002

3、hwi:其实就是hive web interface的缩写它是hive的web借口,是hive cli的一个web替代方案。

我们这里使用hiveserver2来链接hive。

gohive的库,是实现hive的thrift定义的基础接口。我们用thrift生成的库,封装了常用的操作接口。

主要接口包括:

接口 描述
OpenSession 打开链接 建立到hiveserver2的链接,返回一个会话
ExecuteStatement 执行语句 提交执行的语句,可以同步等等,可以异步。返回一个操作handle
GetoperationStatus 查询执行状态 根据handle查询状态是否完成,返回成功状态
GetResultSetMetadata 根据handle查询该语句的返回的表头
FetchResults 取结果 根据handle批量取结果
CloSEOperation 关闭查询操作 关闭操作handle
CloseSession 关闭会话 关闭会话

异步模式:
ExecuteStatement提交时设置executeReq.RunAsync=true
hiveserver2会立刻返回接受查询成功,需要定时不断请求GetoperationStatus来获取状态是否完成。
期间可以提交其它查询请求。
同步模式:
ExecuteStatement提交时设置executeReq.RunAsync=true
hiveserver2会等待查询结果完成才返回。
返回后使用GetoperationStatus查到结果是成功或者失败状态。

可以将handle序列化存到数据库。如果程序断了,或者任务不在内存中,可以从数据库取出反序列化,继续查询状态等操作。

具体代码参看:
github.com/uxff/gohive
该库中hive版本对应2.1,thrift版本是0.9.3.

为了兼容hive,当前链接的hiveserver2使用的thrift版本是0.9.3,我们需要将$GOPATH/src/git.apache.org/thrift.git/lib/go/thrift 项目下的版本切换到0,9.3。

$ cd $GOPATH/src/git.apache.org/thrift.git/lib/go/thrift
$ checkout -b 0.9.3 origin/0.9.3

如果git.apache.org访问不方便可以用github.com/apache/thrift 替代。
如果需要更新thrift版本兼容,则删除tcliservice,将tcliservice.ctx重命名为tcliservice,进行go build会报错,将报错中对应的thrift接口第一个参数前增加context.Background(),即可。

遇到的坑: 1. thrift生成的go代码,解析FetchResults返回的RowSet会有问题。返回的格式是不是行优先,而是列优先,需要手工转换。 2. hiveserver2启动必须使用NOSASL模式。