Presto源码解析--提交查询

本文详细介绍了基于Presto 330版本的查询提交步骤,包括通过CLI和JDBC的方式连接,重点解析了使用CLI提交查询的三个主要步骤:获取SQL、组装RESTful请求和显示查询结果。还深入源码分析了`Presto`类的执行逻辑,特别是`executeCommand`方法,展示了如何处理SQL语句并提交给Coordinator。整个过程涉及了客户端与Coordinator之间的交互,以及查询结果的处理和展示。

本文的Presto是基于330版本

提交查询的步骤

presto的连接方式可以有两种,分别是CLI形式的和JDBC形式的,分别对应源码中的presto-cli模块和presto-jdbc模块,后续真正提交到presto coordinator对应到presto-client模块。本文以CLI来讲解Presto如何提交查询。

Presto客户端对查询语句的提交主要分为以下3个步骤:

  1. 从制定的文件、命令行参数或者Cli窗口中获取需要执行的Sql语句。
  2. 将得到的Sql语句组装成一个RESTful请求,发送给Coordinator,并处理返回的饿response。
  3. Cli会不停的循环分批读取查询结果并在屏幕进行动态显示,直到查询结果完全显示。

Cli方式

java  -jar presto-cli-330-xxx-SNAPSHOT-executable.jar  --server localhost:8080 --catalog hive --source dispatcher --client-tags adhoc  --user dispatcher --client-request-timeout 60m --session implicit_conversion=true

之后就会进入Presto的客户端

时序图

大体的执行流程
在这里插入图片描述

源码分析

执行上面的可执行jar的main class实际上是io.prestosql.cli.Presto这个类,大体上的意思就通过airline解析命令行的参数,然后运行**console.run()**方法。


package io.prestosql.cli;

import static io.airlift.airline.SingleCommand.singleCommand;

public final class Presto
{
   
   
    private Presto() {
   
   }

    public static void main(String[] args)
    {
   
   
        //根据传递的参数初始化一个Console对象,该对象中保存了启动Cli时传入的参数
        Console console = singleCommand(Console.class).parse(args);
		//如果启动的时候使用了--help或者--version则会显示帮助信息或者版本信息,然后直接退出
        if (console.helpOption.showHelpIfRequested() ||
                console.versionOption.showVersionIfRequested()) {
   
   
            return;
        }
		//进入主程序,然后根据启动Cli传入的不同参数进行不同的处理
        System.exit(console.run() ? 0 : 1);
    }
}

进入Console类的run方法中,其中大体逻辑就是先分析Cli启动时有没指定了–execute或者–file参数,如果指定了就执行executeCommand方法,否则就执行runConsole方法,这两个方法最终都会进入Console类的process方法中

public boolean run()
    {
   
   
    	//获取上面命令行中的所有参数,封装到ClientSession对象中
        ClientSession session = clientOptions.toClientSession();
        //判断有没--execute and --file 参数
        boolean hasQuery = clientOptions.execute != null;
        boolean isFromFile = !isNullOrEmpty(clientOptions.file);
		//初始化日志
        initializeLogging(clientOptions.logLevelsFile);

        String query = clientOptions.execute;
        if (hasQuery) {
   
   
            query += ";";
        }

        if (isFromFile) {
   
   
        	//--execute and --file 两个参数不能同时出现
            if (hasQuery) {
   
   
                throw new RuntimeException("both --execute and --file specified");
            }
            try 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值