RESTful框架解析
Presto几乎所有操作都依赖AirLift框架构建的RESTful服务来完成(数据传输,节点通信,心跳感应,计算调度,计算分布等)。包括4类RESTful接口,包括Statement,Query,Stage,Task。
Statement接口
与SQL相关的请求由该接口处理,包括提交SQL语句,获取查询执行结果,取消查询等。
/v1/statement
– POST
传入SQL并获取查询结果,调用query.getNextResults
分批返回查询结果/v1/statement/{queryId}/{token}
– GET
根据Token返回queryId对应的查询的部分执行结果,Token用于保证结果顺序/v1/statement/{queryId}/{token}
– DELETE
用于取消一个query。Token参数无实际用途,仅用于将此方法和QueryResource中的cancellQuery方法区别开。同时两个方法的区别还在于这里的cancelQuery还包含了特殊状态处理和exchangeClient的关闭和清理query.getNextResults
获得查询执行结果,只等待maxWaitTime
指定的时间,超时仅返回该时间内处理完成的数据,会调用createNectResultsUri
生成请求下一批结果的地址一起返回给客户端
Query服务接口
处理与查询执行相关的请求,包括查询状态的查询,生成和取消查询,或者取消一个Stage
/v1/query/{queryId}
– GET
查询一个query的执行状态/v1/query
– POST
生成一个新的查询,传入SQL新建查询/v1/query/{queryId}
– DELETE
取消一个查询/v1/query/stage/{stageId}
– DELETE
取消一个Stage
Stage服务接口
处理Stage相关的请求,只有一个功能,即取消或者结束一个指定的Stage
/v1/stage/{stageId}
– DELETE
提前结束一个Stage
Task服务接口
与Task相关的请求,如Task的创建,更新,状态查询和结果查询等。
/v1/task/{taskId}
– POST
创建一个新的Task或者更新Task状态,如果存在taskID对应的Task,就而根据taskUpdateRequest中的内容更新Task,否则创建一个新的Task/v1/task/{taskId}
– GET
获取Task相关的信息/v1/task/{taskId}
– DELETE
删除或提前结束对应的Task/v1/task/{taskId}/results/{outputId}/{token}
– GET
用于获得TaskId指定的Task生成的用于输出给下游Task(由outputId标识)的数据/v1/task/{taskId}/results/{outputId}/{token}
– DELETE
用于删除TaskId指定的Task生成的用于输出给下游Task(由outputId标识)的数据
提交查询
主要流程
- 从指定文件,命令行参数或者Cli中获取SQL语句
- 将得到的SQL语句组装成RESTful请求,并发送给Coordinator,并处理返回的Response
- Cli分批读取结果显示在屏幕,直到查询全部完成
源码解析
- 启动PrestoCli(无–help或–version)处理SQL
- 根据参数选择直接提交SQL或者启动Cli终端
- 查询分为两部分:初始执行和循环发送请求获取查询结果
- 初始执行方法为
cli.QueryRunner.startQuery(query)
这个方法组装Uri地址将SQL语句发送给Coordinator的/v1/statement
来调用createQuery
执行SQL语句。随后调用cli.Query.renderOutput(...)
来获取查询结果 - 根据传入的interactive标识来决定是否实时更新结果
- 如果动态显示则间隔打印结果
- 分别调用
client.advance()
来请求Coordinator来获得当前已处理完的部分数据 - 根据返回值中
NextUri
是否为null类修改valid
的值来空值是否继续循环调用client.advance()
- 如果不动态显示就等待到所有结果返回
- 初始执行方法为