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模式。