一 什么是Hive,它能解决什么问题?
Hive是一个基于Hadoop的数据仓库平台。它通过HDFS进行存储,通过MapReduce执行查询计划,使用类SQL的查询语言HQL作为查询接口。
作用:可以很方便我们进行数据的ETL工作,避免了使用MapReduce来做如此复杂事情。
二 Hive的架构
三 Hive的原理
客户端发起查询请求,比如你在HiveShell发送一条HQL语句,会调用Cli.sh 并调用入口类CliDriver这个类
3.1解析参数,设置一些属性等
3.2创建ConsoleReader,不断的读取控制台参数,直到遇到分号为止
3.3判断这个语句是否编译过,如果没有编译需要先编译,调用Driver#compile方法:
3.3.1创建QueryState对象
3.3.2创建ParserDriver,调用ParserDriver#parse方法进行查询解析,生成ASTNode(抽象语法树),使用的是antlr(根据输入自动生成语法树的开源语法分析器):
生成ASTNode的规则:根据token 创建ASTNode
比如INSERT OVERWRITETABLE access_log SELECT a.user,a.prono,
p.maker,p.priceFROM access_log_hbase a JOIN product_hbase p ON
(a.prono= p.prono)
3.3.3创建语义分析器SemanticAnalyzer
通过SemanticAnalyzerFactory#get(conf,tree)传入的ASTNode的type创建不同的SemanticAnylyzer,这里应用的是简单工厂模式。
TOK_EXPLAIN=>ExplainSemanticAnalyzer
TOK_EXPLAIN_SQ_REWRITE=>ExplainSQRewriteSemanticAnalyzer
TOK_LOAD=>LoadSemanticAnalyzer
TOK_EXPORT=>ExportSemanticAnalyzer
TOK_IMPORT=>ImportSemanticAnalyzer
TOK_ALTERTABLE=>DDLSemanticAnalyzer
TOK_ALTERVIEW=>DDLSemanticAnalyzer
TOK_QUERY=>SemanticAnalyzer
TOK_CREATEFUNCTION、TOK_DROPFUNCTION=>FunctionSemanticAnalyzer
TOK_ANALYZE=>ColumnStatsSemanticAnalyzer
TOK_UPDATE_TABLE/TOK_DELETE_FROM=>UpdateDeleteSemanticAnalyzer
默认情况就是SemanticAnalyzer
3.3.4通过语义分析器BaseSemanticAnalyzer#analyze进行语义分析
#根据语法树创建解析树
=>分析和处理表的别名
=>分析创建表和视图的命令
=>分析form子句的子ASTNode
=>在这过程中,会往QueryBlock填充一些信息(QB: 查询的基本组成单元)
=>根据QB获取元数据:
"a":TableInfo("access_log_hbase")
"p":TableInfo("product_hbase")
#遍历QueryBlock, 根据解析树创建操作树OperatorTree
=>根据from从句得到所有的操作信息:循环递归子查询去填充执行计划部分的子查询;然后递归所有的源表,添加