---Hive源码解析
文章平均质量分 97
关于Hive的源码分析
寒 暄
自渡
展开
-
Hive源码阅读–查询分析器–SemanticAnalyzer
SemanticAnalyzer可以说是对查询所有的优化都在其中。代码量有13514行,我们主要关注他对analyzeInternal的实现。 void analyzeInternal(ASTNode ast, PlannerContext plannerCtx) throws SemanticException { // 1.从语法树生成解析树 LOG.info("Starting Semantic Analysis"); processPositionAlias(ast);原创 2020-08-24 11:53:15 · 1100 阅读 · 0 评论 -
Hive源码阅读–词法、语法解析–HiveLexerX/HiveParser
public HiveParser(TokenStream input, RecognizerSharedState state) { super(input, state); this.adaptor = new CommonTreeAdaptor(); this.errors = new ArrayList(); this.msgs = new Stack(); this.excludedCharForColumnName.原创 2020-08-22 17:30:07 · 1752 阅读 · 1 评论 -
Hive源码阅读--SQL on JOB--ParseDriver/BaseSemanticAnalyzer/QueryPlan/execute
SQL --> ASTSQL转换为AST需要经过org.apache.hadoop.hive.ql.parse.ParseDriver的parse方法。通过org.apache.hadoop.hive.ql.Driver的compile方法中的ASTNode tree = pd.parse(command, this.ctx);进行跳转。org.apache.hadoop.hive.ql.parse.ParseDriver----------public ASTNode parse(Str原创 2020-08-21 15:55:43 · 1052 阅读 · 0 评论 -
Hive源码阅读--导读
总述Hive的执行流程大致分为两部分,即任务的提交与返回,命令的编译与执行。前者在CliDriver类中流转,后者主要在Driver与ParseDriver类,核心编译在BaseSemanticAnalyzer和QueryPlan类中。任务的提交与返回调用顺序:main --(程序的开始)–>run --(任务的开始,读取用户传参与相关配置,初始化日志)–>executeDriver --(确保传入的语句是一条完整的SQL或命令)–>processLine --(原创 2020-08-21 11:58:10 · 2483 阅读 · 6 评论 -
Hive源码阅读--SQL的语法解析和语义分析--Driver
前面五个类,殊途同归都是CliDriver类,他负责接受用户在命令行上输入的信息,然后准备执行并将执行的结果返回。而真正底层干事情的是Driver,他将接受到的命令编译,优化为MR(或RDD),真正的调动集群跑作业。在processLocalCmd中有这样一句ret = qp.run(cmd).getResponseCode();,这句中的run不是CliDriver的run,而是Driver的run。 public CommandProcessorResponse run(String comman原创 2020-08-21 10:25:00 · 1044 阅读 · 0 评论 -
Hive源码阅读--命令的执行与返回--processLocalCmd
处理sql命令,根据不同的命令处理器处理不同sql命令,主要区分处理器是否是Driver类,如果是,处理除了(set,reset,dfs,add,list,delete,reload,crypto)命令外的其他sql ,如果不是调用各自处理器的run方法.int processLocalCmd(String cmd, CommandProcessor proc, CliSessionState ss) { int tryCount = 0; int ret = 0;原创 2020-08-20 16:50:01 · 428 阅读 · 0 评论 -
Hive源码阅读--作业的执行--processCmd
在processCmd方法中,主要流程有:去除命令中的注释;如果命令是quit或exit,则退出;如果命令是source开头,则校验source命令后面的文件是否存在,存在则执行processFile;如果命令是以感叹号!开头,表明是shell命令,这时候直接调用shell命令执行器执行;如果以上都不是,则说明是本地模式。然后获得命令处理器,并调用processLocalCmd执行命令。这里说出了processCmd向后的两个方向,第一个方向是processFile,用于执行文件,第二个方向原创 2020-08-20 16:25:25 · 430 阅读 · 0 评论 -
Hive源码阅读--作业的准备--processLine
processLine可以理解为作业上了一道保险,确保如果因为特殊情况需要中止作业的话有结束的方法。同时将每一条语句提交给processCmd执行并接受返回值。相当于为作业正式执行做铺垫的类。public int processLine(String line, boolean allowInterrupting) { SignalHandler oldSignal = null; Signal interruptSignal = null; // 1.默原创 2020-08-20 15:48:04 · 678 阅读 · 1 评论 -
Hive源码阅读--作业的提交--executeDriver
在run方法最后调用了executeDriver方法,同时传入三个参数:ss hiveconf用户配置conf hiveconf默认配置oproc 用户环境配置private int executeDriver(CliSessionState ss, HiveConf conf, OptionsProcessor oproc) throws Exception { // 1.创建cli对象 CliDriver cli = new CliDriver(); //原创 2020-08-20 15:09:31 · 514 阅读 · 0 评论 -
Hive源码阅读--作业的入口--CliDriver
hive执行流程整个流程的第一步,就是cli提交作业给driver,这一步需要通过org.apache.hadoop.hive.cli.CliDriver类。CliDriver类首先看CliDriver类的main方法。org.apache.hadoop.hive.cli.CliDriver---------- /** * 输入参数String[] args不需要分析,是外部命令传进来的参数 */ public static void main(String[] args) t原创 2020-08-20 11:28:00 · 2224 阅读 · 0 评论