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标识)的数据

提交查询

主要流程

  1. 从指定文件,命令行参数或者Cli中获取SQL语句
  2. 将得到的SQL语句组装成RESTful请求,并发送给Coordinator,并处理返回的Response
  3. Cli分批读取结果显示在屏幕,直到查询全部完成

源码解析

  1. 启动PrestoCli(无–help或–version)处理SQL
  2. 根据参数选择直接提交SQL或者启动Cli终端
  3. 查询分为两部分:初始执行和循环发送请求获取查询结果
    1. 初始执行方法为cli.QueryRunner.startQuery(query)
      这个方法组装Uri地址将SQL语句发送给Coordinator的/v1/statement来调用createQuery执行SQL语句。随后调用cli.Query.renderOutput(...)来获取查询结果
    2. 根据传入的interactive标识来决定是否实时更新结果
    3. 如果动态显示则间隔打印结果
    4. 分别调用client.advance()来请求Coordinator来获得当前已处理完的部分数据
    5. 根据返回值中NextUri是否为null类修改valid的值来空值是否继续循环调用client.advance()
    6. 如果不动态显示就等待到所有结果返回