全网都没有找到介绍怎么使用kyuubi rest api,于是自己研究了一下
首先要设置kyuubi配置项,来支持REST
vim conf/kyuubi-defaults.conf
kyuubi.frontend.rest.bind.host 0.0.0.0
kyuubi.frontend.rest.bind.port 10099
kyuubi.frontend.protocols=THRIFT_BINARY,THRIFT_HTTP,REST
启动kyuubi server
bin/kyuubi start
访问WEB UI
http://34.126.178.230:10099/static/sessions.html
Kyuubi关键REST接口
接口 | 接口说明 | 请求方法 | URL | 示例URL | 备注 | |
创建会话 | 在Kyuubi创建一个Session用户会话,一个Session对应我们调度系统的一个作业实例 | POST | /sessions | http://34.126.178.230:10099/api/v1/sessions | 返回sessionHandle | |
提交SQL | 基于会话,提交一个sql到Kyuubi,在Kyuubi测会封装成一个operation | POST | /sessions/{sessionHandle}/operations/statement | http://34.126.178.230:10099/api/v1/sessions/c6e59a42-39f9-44cf-8078-7c2285696182/operations/statement | 返回operationHandle | |
轮询状态 | 查询指定operation当前的状态 | GET | /operations/{operationHandle}/event | http://34.126.178.230:10099/api/v1/operations/7b51fba9-ec8e-495c-bace-cdcbdadb4006/event | 重点字段:state | |
查询日志 | 查询指定operation当前的执行日志 | GET | /operations/{operationHandle}/log | http://34.126.178.230:10099/api/v1/operations/7b51fba9-ec8e-495c-bace-cdcbdadb4006/log | 日志包含Spark web ui信息 | |
查询结果集 | 查询指定operation当前的结果集,如果已经跑完的话 | GET | /operations/{operationHandle}/rowset | http://34.126.178.230:10099/api/v1/operations/7b51fba9-ec8e-495c-bace-cdcbdadb4006/rowset | 有一个size配置项可以控制返回记录条数 | |
终止执行 | 终止执行指定operation | PUT | /operations/{operationHandle} | http://34.126.178.230:10099/api/v1/operations/7b51fba9-ec8e-495c-bace-cdcbdadb4006 |
1.创建Session接口
默认情况下,经过过滤器AuthenticationFilter拦截,使用BasicAuthenticationHandler类来做认证
这里需要设置Header,Authorization:"BASIC aGl2ZTpoaXZl"
其中aGl2ZTpoaXZl是字符串hive:hive的base64编码
2.提交SQL接口
3.轮询状态接口
因为提交spark sql是异步操作,需要轮询operation的状态,重点是state字段,当state=FINISHED_STATE时,说明operation执行完成了,可以调用rowset接口获取查询结果了
4.查询日志接口
请注意日志中d3d60a3b-9c85-4e27-9773-d322f1084d34是spark的job id,可以根据它直接检索spark原生的一些状态
5.查询结果集接口
6.终止执行接口
Kyuubi官网REST api说明
https://kyuubi.readthedocs.io/en/latest/client/rest/rest_api.html
创建Session和提交SQL分别对应着LaunchEngine和ExecuteStatement两个类,继承关系如下:
LaunchEngine —> KyuubiOperation —> AbstractOperation —> Operation
ExecuteStatement —> KyuubiOperation —> AbstractOperation —> Operation
LaunchEngine
LaunchEngine定义一些启动引擎的特定行为,在runInternal()执行了KyuubiSessionImpl的openEngineSession(),根据namespace通过服务发现获得一个可用的engine,如果没有则创建一个engine,根据engineType来构建一个builder对象,每个引擎类型需要的构建参数不一样,然后拉起一个engine的新进程,新进程启动的时候会把自己注册到服务注册中心,所以LaunchEngine这里只会有查服务发现的代码
KyuubiSessionImpl的openEngineSession()通过服务发现实际获得的是一个(host, port),现在引擎的ip和端口已经有了,然后创建一条到engine的thrift连接_client,_client是一个KyuubiSyncThriftClient类型对象,实际上全部跟引擎交互的操作都是在这个类里面完成的,现在有连接了,然后通过_client发起创建session的请求,获得两个重要对象_remoteSessionHandle和_engineId,接下来这个session对engine的全部操作都需要带上_remoteSessionHandle,_engineId则代表一个引擎的唯一编号
ExecuteStatement
ExecuteStatement定义一些执行语句的特定行为,在runInternal()执行了executeStatement()和waitStatementComplete(),前者是异步提交sql,后者是一条线程,不断轮询日志和结果
ExecuteStatement类waitStatementComplete方法被封装成一个线程,提交到SessionManager持有的线程池execPool,这个线程用一个while循环来轮询获取最新状态和日志,调用client的getOperationStatus和fetchResults,需要传递参数_remoteOpHandle
KyuubiOperation
KyuubiOperation持有client和_remoteOpHandle
KyuubiOperation,自身维护了一个_remoteOpHandle,并从Session拿到_client,可以通过thrift client连接到spark engine做一些获取结果集操作,做取消执行操作。
AbstractOperation
AbstractOperation持有handle和_backgroundHandle,还有维护一些状态和超时计算,_backgroundHandle是一个标准的java的Future,用来异步操作engine的后台线程
AbstractOperation定义了执行框架的模板方法,run()里面,先后执行了beforeRun(),runInternal(),afterRun()
Operation
Operation接口定义了run(),cancel(),close()等方法