1.入口$HIVE_HOME/bin/ext/cli.sh
- 调用org.apache.hadoop.hive.cli.CliDriver类进行初始化过程
- 处理-e,-f,-h等信息,如果是-h,打印提示信息,并退出
- 读取hive的配置文件和.hiverc文件,设置HiveConf
- 创建一个控制台,进入交互模式
2.读取命令processLine分割处理
- 在交互模式下,读取输入命令行,直到";"为止。
- 然后提交给processLine方法处理,该方法将输入以";"分割成多个命令,
- 然后交给processCmd(cmd)处理
3.命令的预处理processCmd
根据输入命令的第一个记号(Token),分别进入相应的流程
- Quit/Exit系统正常退出
- !开头的执行Linux操作系统命令
- source 开头的读取外部文件并执行文件中的命令
- list 列出缓存中的jar/file/archive
- 其他命令提交给CommandProcess处理
4.命令的预处理CommandProcess
根据输入命令的第一个记号,分别进行处理
- set 调用SetProcess类,设置hive的环境参数,并保存在该进程的HiveConf中
- dfs 调用DfsProcess类,调用hadoop的shell接口,执行hadoop的相关命令
- add 调用AddResourceProcess类,导入外部的资源,只对该进程有效
- delete 与add对应,删除资源 * 其他:提交给Driver类,进行下一步处理
5.命令的处理(Driver类的run方法)
- 编译compile(Hive的核心部分)
- 通过语言识别工具Antlr,验证语句的合法性
- 将sql转换成一个抽象语法树(AST)
- 定义树解释器Operator,将AST翻译成逻辑操作树
- 调用genMapRed方法,生成物理执行计划
- 获取读写锁:对操作的表获取一个读写锁acquireReadWriteLocks
- 执行execute:将生成的Task提交hadoopAPI 处理,返回任务的执行时间和状态(成功or失败)
6.获取执行的结果
- 任务执行失败,抛出异常
- 执行成功后,调用Driver的GetReuslt方法,顺序打开每一个输出文件
- 获取每一行的输出,并打印到控制台
7.执行清理
- 清理hive执行过程中的中间文件和临时文件
- 退出该条命令的执行,返回控制台并等待下一条命令的输入
时间: 2024-10-16 22:00:37