下面将以一个完整的SQL语句为例,介绍提交后经过ODPS处理的全流程:
提交作业:
- 通过console提交一个SQL语句。
- 调用SDK计算配置信息中的签名。
- 发送 RESTful 请求给HTTP服务器。
- HTTP 服务器发送请求到云账号服务器做用户认证。
- 认证通过后,请求就会以 Kuafu通信协议方式发送给 Worker。
- Worker判断该请求作业是否需要启动Fuxi Job。如果不需要,本地执行并返回结果。
- 如果需要,则生成一个 instance, 发送给 Scheduler。
- Scheduler把instance信息注册到 OTS,将其状态置成 Running。
- Scheduler 把 instance 添加到 instance 队列。
- Worker把 Instance ID返回给客户端。
运行作业:
- Scheduler会把instance拆成多个Task,并生成任务流DAG图。
- 把可运行的Task 放入到优先级队列TaskPool中。
- Scheduler 有一个后台线程定时对TaskPool 中的任务进行排序。
- Scheduler 有一个后台线程定时查询计算集群的资源状况。
- Executor在资源未满的情况下,轮询TaskPool,请求Task。
- Scheduler判断计算资源。若集群有资源,就将该Task发给Executor。
- Executor调用SQL Parse Planner,生成SQL Plan。
- Executor 将 SQL Plan 转换成计算层的 FuXi Job 描述文件。
- Executor 将该描述文件提交给计算层运行,并查询 Task 执行状态。
- Task 执行完成后,Executor更新 OTS 中的 Task信息,并汇报给 Scheudler。
- Schduler 判断 instance 结束,更新 OTS 中 instance 信息,置为 Terminated。
查询状态:
客户端接收到返回的 Instance ID 后,可以通过 Instance ID 来查询作业状态:
- 客户端会发送另一个 REST 的请求,查询作业状态。
- HTTP 服务器根据配置信息,去云账号服务器做用户认证。
- 用户认证通过后,把查询的请求发送给 Worker。
- Worker 根据 InstanceID 去 OTS 中查询该作业的执行状态。
- Worker 将查询到的执行状态返回给客户端。