在客户端和Coordinator交互解析提到,在coordinator接收v1/statement/queued
请求的时候,就会创建一个DispatchQuery。这里我们稍微深入一下这里的流程。
在trino中,SQL的提交、解析、调度、执行等都是异步的,我们这里就用一个个的线程来看看他们的每个流程。
DispatchManager#dispatchExecutor
这个线程就是通过LocalDispatchQueryFactory创建一个DispatchQuery(也就是LocalDispatchQuery),并提交给resourceGroupManager等待调度。
创建LocalDispatchQuery的时候,这里做了两件事,一个是为当前的Query实例创建了状态机。状态机维护了Query实例执行的请客,包括以下状态:
- QUEUED:查询已经被接收,但尚未开始执行。
- WAITING_FOR_RESOURCES:等待资源(如CPU时间、内存或I/O资源)。
- DISPATCHING:查询任务正在被安排或发送。
- PLANNING:查询正处于规划阶段。这意味着系统正在解析查询语句、进行语法和语义分析,并生成一个或多个逻辑执行计划。接下来,这些逻辑计划会被优化并转化为物理执行计划
- STARTING:查询已经完成规划,正在准备执行。这个状态可能涉及分配所需的资源、初始化执行环境等准备工作。
- RUNNING:查询正在执行中。数据正在被读取、处理,并且可能在多个节点上并行计算。
- FINISHING:查询已经成功完成执行。所有相关的任务都已结束,结果(如果有的话)已经准备好供用户消费。
- FINISHED:查询已经成功完成执行,所有数据已经被消费。
FAILED:查询执行过程中遇到了错误或异常,无法继续或完成。
状态机创建的时候,初始状态就是QUEUED。
另外一个就是创建了SqlQueryExecution实例,用于查询计划的执行以及调度,在创建的时候,就会对AST进行解析。
LocalDispatchQuery创建后就会加到QueryTracker并提交给resourceGroupManager,resourceGroupManager在判断可以运行的情况下,就会提交任务到他的线程池中。InternalResourceGroup#executor
这里就把状态机的状态改为WAITING_RESOURCES,并提交给新的线程。
LocalDispatchQuery#queryExecutionFuture
这个线程要等待前面异步创建的SqlQueryExecution实例完成后才会执行。他会创建一个Future,这个Future会判断是否有足够的worker实例,如果有,才会调用SqlQueryExecution实例的方法。
LocalDispatchQuery#minimumWorkerFuture
到这个线程的时候,说明已经获取到了worker资源,所以状态机的状态就会改为DISPATCHING,再改为PLANNING。
也就是说,这里会优化逻辑计划树,并生成多个计划片段plan fragment。以及创建QueryScheduler实例,负责plan fragment的分发和他的状态管理。此后状态机的状态就会改为STARTING。
最后为每个plan fragment创建对应的SqlStage、bucket和缓冲区,并且都创建对应的StageScheduler实例,负责对应Stage的调度执行。
此外这里也有一个状态机stateMachine,负责维护PipelinedDistributedStagesScheduler实例的状态,此时状态为PLANNED。PipelinedQueryScheduler#executor
这里是stage调度的地方,也就是上面的StageScheduler实例的schedule方法调用。
当拿到了Splits实例才是调度真正开始的时候,拿到Splits实例后,就会为这些Splits计算他会发到哪些worker节点上,并把catalog等信息发送给对应的worker。QueryStateMachine状态机的前他状态
任务调度开始后,stateMachine的状态就会从PLANNED改为RUNNING。stateMachine有一根监听器,如果状态改为RUNNING,则QueryStateMachine状态机的状态就会改为RUNNING。
如果任务完成,则stateMachine的状态就会改为FINISHED,监听器就会把QueryStateMachine状态机的状态改为FINISHING。
当所有消费都已经完成,QueryStateMachine状态机的状态改为FINISHED。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。