Hive
是将
SQL
语句转换成
hadoop
的
MapReduce
程序,通常在客户端执行
hive
命令,然后输入
SQL
语句后,
hive
将
SQL
语句生成多个
MR
的
job
,然后将这些
job
提交给
hadoop
进行执行,完成后,再把结果放入到
hdfs
或者本地的临时文件中。
Hive
中的表结构信息都是保存在关系型数据库中,如
mysql,derby
等,可以通过
hive-site.xml
中配置数据库的
URL,
用户名,密码等。而表的实际数据内容保存在
hadoop
的
hdfs
文件中,行和列数据分别用特殊字符串分格开,以便能够读取数据,默认是用
ctrl+a
和
\n
来分隔。
客户
/
服务器通信:由
org.apache.hadoop.hive.ql
包中的
Driver
类来完成,该类主要有一个
run(command)
方法,而该方法主要有二个方法组成:
int ret = compile(command);
此方法主要完成语法,语义,计划生成。
ret = execute();
执行物理计划,即提交相应的
job
给
hadoop
进行执行。
执行完成后,会将执行结果通过
CommandProcessorResponse
类包装返回给客户端。
另外,在hive
中,提供本地直接运行hive
命令,也提交了jdbc
访问。具体实现分别在对应的包里。
语法分析器:将
sql
语句转换成一颗语法树,像编译原理书上讲的,其实就是一个普通树,只不过这颗保存了
sql
语句的结构,而
hive
是用
anltr
自动生成的语法树。分别由
org.apache.hadoop.hive.ql.parse
包中的HiveLexer
和HiveParser
完成词法和语法分析工作。
语义分析:根据不同的类型的语句生成不同的语法,所以有个抽象语义分析类
BaseSemanticAnalyzer
,分别有以下子类,对应于不同类型的语句:
ExplainSemanticAnalyzer
ExplainSemanticAnalyzer
LoadSemanticAnalyzer
DDLSemanticAnalyzer
FunctionSemanticAnalyzer
SemanticAnalyzer
语义分析完成后,会将语句中的相应信息放入到
org.apache.hadoop.hive
.ql.plan
包中
*Desc
类中,这些类记录了相应语句的基本信息。
然后会对语义完了的信息进行验证,比如表是否存在,字段是否存在,这时需要查询元数据,同时将表的相关信息放到
desc
对象中。
逻辑计划生成器:根据语义分析后的相关信息,将生成出逻辑操作树,抽象类为
Operator
。子类有:
ExtractOperator
FilterOperator
ForwardOperator
GroupbyOperator
LateralViewJoinOperator
LimitOperator
MapOperator
ScriptOperator
SelectOperator
TableScanOperator
TerminalOperator-Base Class
FileSinkOperator
ReduceSinkOperator
UDTFOperator
UnionOperator
计划优化器:将操作树进行一些优化,主要是基于规则的优化。这部分,这次我略过了,下次再讲解。
物理计划生成器:根据逻辑操作树生成出物理计划树,这个物理计划是由
Task
对象来包装的,而
Task
类会有一个
Work
对象,
Work
类是物理计划的描述,当
task
对象执行时,通常需要用到
work
对象上的相关信息。
Work
子类有:
FetchWork
MoveWork
MapredWork
CopyWork
DDLWork
FunctionWork
ExplainWork
ConditionalWork
物理计划执行器:就是将一颗含有
Task
类对象的树,进行从上到下执行。分别调用该对象的
execute()
方法,而该方法会完成相应的物理计划执行工作。主要有:
FetchTask
ConditionalTask
CopyTask
DDLTask
ExplainTask
MapRedTask
MoveTask
每个类都表示一种物理计划。如
FetchTask
就是从
hdfs
或者本地文件中取出表或视图的记录。
总结,
Hive
跟大多数的关系数据库类似的,有相同的步骤来完成从语句到最后物理执行。不同的是
Hive
的执行是在
hadoop
的
MR
程序来执行。同时在这个过程中的,操作类,计划类都是由
Java
对象来包装起来,且可以序列化的,相信其他数据库的计划也是某种语言的对象来保存的。
分享到:
相关推荐
hive 源码分析
使用hive3.1.2和spark3.0.0配置hive on spark的时候,发现官方下载的hive3.1.2和spark3.0.0不兼容,hive3.1.2对应的版本是spark2.3.0,而spark3.0.0对应的hadoop版本是hadoop2.6或hadoop2.7。 所以,如果想要使用高...
hive源码,可以学习hive源码,对于源码有兴趣同学可以下载
支持hive 源数据、表结构导出
cloudera-hive-cdh6.3.2源码包
java操作Hive源码之HiveJDBC实例(mysql数据库),附带所需jar包,欢迎下载学习。
HDP3.1.5源码下载—hadoop hbase hive
Scala代码积累之spark streaming kafka 数据存入到hive源码实例,Scala代码积累之spark streaming kafka 数据存入到hive源码实例。
apache-hive-1.2.1源码包(已编译)(含Hive的使用全解)
Hive on Spark源码分析,实际场景中会遇到需求:将Hive默认的执行引擎MapReduce换成Spark或者Tez。
基于Hadoop Hive健身馆可视化分析平台项目源码+数据库文件.zip启动方式 环境启动 hadoop hive2元数据库 sql导入 导入hivesql脚本,修改application.yml 启动主程序 HadoopApplication 基于Hadoop Hive健身馆可视化...
通过shell脚本,批量把一个库下面的表结构全部导出,在开发环境执行过。
讲述了hive的一些主要的技术,主要分为三部分,文中都有提到
文章目录hive源码下载地址解压源码包配置pom文件编辑源码编辑UDF函数注册UDF函数编译hive部署编译后的hive包1. 重新部署hive2. 修改原hive hive源码下载地址 hive版本:hive-1.1.0-cdh5.7.0 百度网盘:链接:...
临时文件链接
大数据分析仓库Hive存储结构扩展的设计和实现.
利用Hive进行复杂用户行为大数据分析及优化案例(全套视频+课件+代码+讲义+工具软件),具体内容包括: 01_自动批量加载数据到hive 02_Hive表批量加载数据的脚本实现(一) 03_Hive表批量加载数据的脚本实现(二) ...
antlr的应用实例教程 hive源码分析 从词法语法语义解析到执行计划的生成优化以及执行。
应用spark2.1的api对hive对进行读写,代码中有明确的操作步骤。
hive-jdbc最新的源码,用于impala数据库的jdbc连接