1. ‘hive’命令是(默认为hive跟目录)./bin下的一个shell脚本,依次加载

  1. ./bin/hive-config.sh,
  2. ./conf/hive-env.sh,
  3. 设置与hadoop、spark、hbase等相关的环境变量、辅助jar文件加载,
  4. 依赖的资源的合法性检查, 然后加载
  5. 载入./lib/ext目录下的所有被称为“service”的脚本里面定义的shell函数,函数里面就是通过“hadoop jar CLASS arg* ”启动了
  6. 根据命令行参数 “--service x”指定的值选择一个service,调用这个service的shell函数以启动hive。不带这个选项时默认是“cli”。
  7. 调用hadoop执行对应的service class。
2. cli 这个service的启动。
    对应的启动类为CliDriver的run函数。
public class CliDriver 
CliDriver.run
  ->OptionsProcessor.process_stage1(args) --初始化hive的配置文件
  ->CliSessionState ss = new CliSessionState(new HiveConf(SessionState.class)); --每个命令行中断都是一个session
  ->oproc.process_stage2(ss)--初始化命令行选项对应的属性设置
  ->SessionState.start(ss);
  ->return executeDriver(ss, conf, oproc);
->int cmdProcessStatus = cli.processLine(ss.execString); --"-e"选项执行,最终调用processLine(String line, boolean allowInterrupting)
->return cli.processFile(ss.fileName); -- "-f"选项执行,最终调用 processLine(String line, boolean allowInterrupting)
->reader.addCompleter(completer); --对于交互式的命令行,设置判定一个语句结束的“判定者”。
->ret = cli.processLine(line, true); -- 遇到一个完整的语句则执行一条语句
processLine(String line, boolean allowInterrupting)
  ->oldSignal = Signal.handle(interruptSignal, new SignalHandler() --处理“ctl+c”
  ->ret = processCmd(command);
->String[] tokens = tokenizeCmd(cmd_trimmed); --命令行token化
->if (cmd_trimmed.toLowerCase().equals("quit") || cmd_trimmed.toLowerCase().equals("exit")) --退出
->if (tokens[0].equalsIgnoreCase("source")) --加载文件
 ->cmd_1 = new VariableSubstitution().substitute(ss.getConf(), cmd_1); --替换文件名中的变量,如set,env等
 -> ret = processFile(cmd_1); --又回到执行文件了
->if (cmd_trimmed.startsWith("!")) --执行shell命令
->else CommandProcessor proc = CommandProcessorFactory.get(tokens, (HiveConf) conf);
ret = processLocalCmd(cmd, proc, ss);
 ->qp.run(cmd).getResponseCode(); --Driver.run()执行命令行,然后显示结果
 
 
public class Driver implements CommandProcessor
  public CommandProcessorResponse run(String command, boolean alreadyCompiled)
-> CommandProcessorResponse cpr = runInternal(command, alreadyCompiled);
 ->HiveDriverRunHookContext hookContext = new HiveDriverRunHookContextImpl(conf, command); --hook相关初始化调用
 ->private int compileInternal(String command)
-> public int compile(String command, boolean resetTaskIds)
 ->ParseDriver pd = new ParseDriver(); --语法分析,生成抽象语法书AST
 ->ASTNode tree = pd.parse(command, ctx);
 ->BaseSemanticAnalyzer sem = SemanticAnalyzerFactory.get(conf, tree); --语义分析,生成逻辑计划
 ->sem.analyze(tree, ctx);  
 ->plan = new QueryPlan(command, sem, perfLogger.getStartTime(PerfLogger.DRIVER_RUN), queryId,
SessionState.get().getCommandType());  --生成查询计划
->if (requiresLock()) ret = acquireLocksAndOpenTxn(); --如果需要一致性,获取锁。默认不需要一致性。
->ret = execute(); --执行计划
->return createProcessorResponse(ret);

  
3. 至于语法分析、语意分析、执行计划,需要后续单独分析。
  

hive 源码笔记(1):命令行执行的主流程。的更多相关文章

  1. ACTIVITI 源码研究之命令模式执行

    ACTIVITI 是一个优秀开源软件,通过阅读源码,我们不但可以了解工作流引擎执行的原理还可以增加个人的编码功力. ACTIVITI 所有执行过程都是采用命令模式进行执行. 本文主要描述流程引擎数据保 ...

  2. Appium Android Bootstrap源码分析之命令解析执行

    通过上一篇文章<Appium Android Bootstrap源码分析之控件AndroidElement>我们知道了Appium从pc端发送过来的命令如果是控件相关的话,最终目标控件在b ...

  3. 在Mac OS 下 build Tesseract4.0 源码并在命令行中使用

    作者电脑:Mac Mini 系统信息:OS X EI Capitan 10.11.6 Tesseract4.0github地址:https://github.com/tesseract-ocr/tes ...

  4. django源码(2.0.2)粗解之命令行执行

    前言 django的命令行在整个的django web开发中都会经常用到,而且是必须得用到.所以,能够了解下django的命令行实现其实是非常有帮助的. 如果大家比较关心django命令的详细说明和使 ...

  5. hive -help hive命令行执行sql参数

    在shell命令行执行 hive -help 结果如下: -d,--define <key=value> Variable substitution to apply to Hive co ...

  6. redis源码笔记(一) —— 从redis的启动到command的分发

    本作品采用知识共享署名 4.0 国际许可协议进行许可.转载联系作者并保留声明头部与原文链接https://luzeshu.com/blog/redis1 本博客同步在http://www.cnblog ...

  7. Hive源码解析

    date: 2020-07-08 15:12:00 updated: 2020-08-21 17:38:00 Hive源码解析 入口:hive-cli-1.1.0-cdh5.14.4.jar!/org ...

  8. Tomcat8源码笔记(八)明白Tomcat怎么部署webapps下项目

    以前没想过这么个问题:Tomcat怎么处理webapps下项目,并且我访问浏览器ip: port/项目名/请求路径,以SSM为例,Tomcat怎么就能将请求找到项目呢,项目还是个文件夹类型的? Tom ...

  9. Golang构建HTTP服务(一)--- net/http库源码笔记

    搭建一个简单的Go Web服务器 Go语言标准库 - net/http 在学习Go语言有一个很好的起点,Go语言官方文档很详细,今天我们学习的Go Web服务器的搭建就需要用到Go语言官方提供的标准库 ...

随机推荐

  1. 常用的Java工具类——十六种

    常用的Java工具类——十六种 在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法按使用流行度排名,参考数据来源于Github上随机选 ...

  2. frp 路由穿透(github开源穿透软件)

    server配置(windows):下载: https://github.com/fatedier/frp/releases [common] # 服务器端端口 bind_port = # 客户端连接 ...

  3. vue项目默认IE以最高级别打开

    只需要在index.html加入 <meta http-equiv="X-UA-Compatible" content="IE=Edge">

  4. /proc/filesystems各字段含义

    /proc/filesystems A text listing of the filesystems which were compiled into the kernel. Incidentall ...

  5. winform Combox绑定数据时不触发SelectIndexChanged事件

    做了一个仓库选择的联动,选了仓库选其下的货区,选了货区选其下的货架分区.每个combox初始化.绑定数据是都会触发SelectIndexChanged事件,相当头疼. 后来无意中在网上看到了一种方法— ...

  6. Spring boot传值注意事项

    后台debug看到有获取到这个字段的值了,但就是传到前端后,就丢失了这个userId字段,觉得非常奇怪,想不通 后来看到 @JsonIgnore 这个注解就知道原因了 共同学习,共同进步,若有补充,欢 ...

  7. BZOJ1491 [NOI2007]社交网络[最短路计数]

    $n$非常的小,结合题目计算式可以想到$O(n^3)$暴枚$s,t,v$,看$v$在不在$s\to t$最短路上($dis_{s,v}+dis_{v,t}=dis_{s,v}$是$v$在两点最短路上的 ...

  8. 使用js拆分带参数的URL,将参数分离出来

    url中的内容www.XXXX.com?content=123; 一下为js内容,包装在一个init方法中. init(); function init(){ var theRequest = new ...

  9. 并发编程-Java内存模型

    将之前看过的关于并发编程的东西总结记录一下,本文简单记录Java内存模型的相关知识. 1. 并发编程两个关键问题 并发编程中,需要处理两个关键问题:线程之间如何通信及线程之间如何同步. (1)在命令式 ...

  10. 对Webpack 应用的研究-----------------引用

    对大多数 Web 应用来说,页面性能直接影响着流量.这是一个经常为我们所忽视的事实.用户长时间的等待流失的不仅仅是跳出率.转化率,还有对产品的耐心和信赖.很多时候我们没有意识到性能问题,那是因为平常开 ...