QueryQueueManager
- SqlQueryQueueManager
- InternalResourceGroupManager
- NoOpResourceGroupManager(ResourceGroupManager)
SqlQueryQueueManager
涉及QueueKey、QueryQueue、QueryQueueRule,待细看
根据队列规则提交QueryExecution
@Override
public void submit(Statement statement, QueryExecution queryExecution, Executor executor)
{
List<QueryQueue> queues;
queues = selectQueues(queryExecution.getSession(), executor);
根据队列规则提交QueryExecution
queues.get(0).enqueue(createQueuedExecution(queryExecution, queues.subList(1, queues.size()), executor));
}
QueryExecution接口
主要实现类
- FailedQueryExecution
- MockQueryExecution
- DataDefinitionExecution
- SqlQueryExecution
对于SQL查询,主要阅看SqlQueryExecution
SqlQueryExecution::start()
SqlQueryExecution::start()
@Override
public void start()
{
try (SetThreadName ignored = new SetThreadName("Query-%s", stateMachine.getQueryId())) {
try {
// transition to planning
//如果已经在执行或者完成,直接返回
if (!stateMachine.transitionToPlanning()) {
// query already started or finished
return;
}
// analyze query ,调用doAnalyzeQuery,生成逻辑执行计划
PlanRoot plan = analyzeQuery();
//准备元数据(connector的元数据预备工作也在这儿)
metadata.beginQuery(getSession(), plan.getConnectors());
// plan distribution of query
planDistribution(plan);
// if query is not finished, start the scheduler, otherwise cancel it
SqlQueryScheduler scheduler = queryScheduler.get();
if (!stateMachine.isDone()) {
scheduler.start();
}
}
catch (Throwable e) {
//...
}
}
}
SqlQueryExecution::doAnalyzeQuery
涉及Analyzer、LogicalPlanner、PlanFragmenter,待细看
private PlanRoot doAnalyzeQuery()
{
// time analysis phase,记录分析阶段时间
long analysisStart = System.nanoTime();
// analyze query 分析query,词法分析,需要元数据metadata, sqlParser
//备注在生成statement 时需要sqlParser,这里执行计划生成时也需要
//主要对查询体进行分析(where有啥,有哪些聚合函数、窗函数等等,执行计划生成前的查询体结构信息准备工作)
Analyzer analyzer = new Analyzer(stateMachine.getSession(), metadata, sqlParser, accessControl, Optional.of(queryExplainer), parameters);
Analysis analysis = analyzer.analyze(statement);
stateMachine.setUpdateType(analysis.getUpdateType());
// plan query 依据分析好的Analysis,构造逻辑执行计划,
PlanNodeIdAllocator idAllocator = new PlanNodeIdAllocator();
LogicalPlanner logicalPlanner = new LogicalPlanner(stateMachine.getSession(), planOptimizers, idAllocator, metadata, sqlParser, costCalculator);
Plan plan = logicalPlanner.plan(analysis);
queryPlan.set(plan);
// extract inputs 提取输入列
List<Input> inputs = new InputExtractor(metadata, stateMachine.getSession()).extractInputs(plan.getRoot());
stateMachine.setInputs(inputs);
// extract output 提取输出列
Optional<Output> output = new OutputExtractor().extractOutput(plan.getRoot());
stateMachine.setOutput(output);
// fragment the plan 构造子执行计划
SubPlan fragmentedPlan = PlanFragmenter.createSubPlans(stateMachine.getSession(), metadata, nodePartitioningManager, plan, false);
stateMachine.setPlan(planFlattener.flatten(fragmentedPlan, stateMachine.getSession()));
// record analysis time 时间状态更新
stateMachine.recordAnalysisTime(analysisStart);
//构造执行计划根节点
boolean explainAnalyze = analysis.getStatement() instanceof Explain && ((Explain) analysis.getStatement()).isAnalyze();
return new PlanRoot(fragmentedPlan, !explainAnalyze, extractConnectors(analysis));
}
Analyzer 留有疑问,待深入
Analysis analysis = Analyzer.analyze(statement);
public Analysis analyze(Statement statement, boolean isDescribe)
{
Statement rewrittenStatement = StatementRewrite.rewrite(session, metadata, sqlParser, queryExplainer, statement, parameters, accessControl);
Analysis analysis = new Analysis(rewrittenStatement, parameters, isDescribe);
StatementAnalyzer analyzer = new StatementAnalyzer(analysis, metadata, sqlParser, accessControl, session);
analyzer.analyze(rewrittenStatement, Optional.empty());
return analysis;
}
StatementRewrite主要是??
* DescribeInputRewrite
* DescribeInputRewrite
* DescribeOutputRewrite
* ShowQueriesRewrite
* ShowStatsRewrite
* ExplainRewrite
DescribeInputRewrite
主要是将原来的statement,提取输入列,其他部分(FROM\WHERE等)置空