下面将以一个完整的SQL语句为例,介绍提交后经过ODPS处理的全流程:

提交作业:

  1. 通过console提交一个SQL语句。
  2. 调用SDK计算配置信息中的签名。
  3. 发送 RESTful 请求给HTTP服务器。
  4. HTTP 服务器发送请求到云账号服务器做用户认证。
  5. 认证通过后,请求就会以 Kuafu通信协议方式发送给 Worker。
  6. Worker判断该请求作业是否需要启动Fuxi Job。如果不需要,本地执行并返回结果。
  7. 如果需要,则生成一个 instance, 发送给 Scheduler。
  8. Scheduler把instance信息注册到 OTS,将其状态置成 Running。
  9. Scheduler 把 instance 添加到 instance 队列。
  10. Worker把 Instance ID返回给客户端。

运行作业:

  1. Scheduler会把instance拆成多个Task,并生成任务流DAG图。
  2. 把可运行的Task 放入到优先级队列TaskPool中。
  3. Scheduler 有一个后台线程定时对TaskPool 中的任务进行排序。
  4. Scheduler 有一个后台线程定时查询计算集群的资源状况。
  5. Executor在资源未满的情况下,轮询TaskPool,请求Task。
  6. Scheduler判断计算资源。若集群有资源,就将该Task发给Executor。
  7. Executor调用SQL Parse Planner,生成SQL Plan。
  8. Executor 将 SQL Plan 转换成计算层的 FuXi Job 描述文件。
  9. Executor 将该描述文件提交给计算层运行,并查询 Task 执行状态。
  10. Task 执行完成后,Executor更新 OTS 中的 Task信息,并汇报给 Scheudler。
  11. Schduler 判断 instance 结束,更新 OTS 中 instance 信息,置为 Terminated。

查询状态:

客户端接收到返回的 Instance ID 后,可以通过 Instance ID 来查询作业状态:

  1. 客户端会发送另一个 REST 的请求,查询作业状态。
  2. HTTP 服务器根据配置信息,去云账号服务器做用户认证。
  3. 用户认证通过后,把查询的请求发送给 Worker。
  4. Worker 根据 InstanceID 去 OTS 中查询该作业的执行状态。
  5. Worker 将查询到的执行状态返回给客户端。
09-09 15:00