Presto-[20]-QueryQueueManager_QueryQueueExecytion

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等)置空

猜你喜欢

转载自blog.csdn.net/hjw199089/article/details/81415349