流程图地址 https://cwiki.apache.org/confluence/display/Hive/Design#Design-HiveArchitecture
一丶上图英文注释
DRIVER---------------->驱动
COMPILER-------------->编译器
metaSTORE------------->元数据
JOBTRACKER------------>job服务器
EXECCUTIONENGINE------>执行引擎
metaDataOps for DDLs-->元数据管理
fetchResults---------->获取结果
sendResults----------->发送结果
taskTracker----------->task服务器
map Operator Tree----->map算子树
reduce Operator Tree-->reduce算子树
serde/Deserialize----->序列化/反序列化器
executeQuery---------->执行查询
getPlan--------------->获取计划
sendPlan-------------->发送计划
executePlan----------->执行计划
二丶Hive的主要组件
图1展示了Hive的主要组件及其与Hadoop的交互
1.WebUI--用户向系统提交查询和其他操作的用户界面
2.驱动程序[DRIVER]--接收查询的组件,这个组件实现了会话句柄的概念,提供执行和基于JDBC/ODBC接口的API
3.编译器[COMPILER]--解析查询的组件,对不同的查询块和查询表达式进行语义分析,并最终在metastore上查找表和分区元数据的帮助下生成执行计划。
4.元数据[metaSTORE]--存储仓库中各种表和分区的所有结构信息的组件,包括列和列类型信息,读写数据所需的序列化器和反序列化器,以及存储数据的对应HDFS文件。
5.执行引擎[EXECCUTION ENGINE]--执行由编译器创建的执行计划的组件,该计划是一个分阶段的DAG,执行引擎管理计划的这些不同阶段之间的依赖关系,并在适当的系统组件上执行这些阶段。
三丶执行步骤解析
图1 是一个典型的查询流式系统。
1.使用WebUI调用执行驱动程序接口[步骤1]进行查询。
2.驱动器创建一个会话处理查询,并将此查询发送到编译器得到一个执行计划[步骤2]。
3.编译器从元数据(metaStore)得到必要的元数据信息(步骤3和步骤4),元数据还用于在查询树中对表达式进行类型检查,以及根据查询谓词[where]修剪分区。
4.编译器生成的计划(步骤5)是一个阶段的DAG,每个阶段要么是map/reduce作业,要么是元数据操作,要么是对HDFS的操作。
对于map/reduce阶段,计划包含map算子树(在mapper上执行的算子树)和reduce算子树(对于需要的reducer操作)。
5.执行引擎[EXECCUTION ENGINE] 将这些阶段提交给适当的组件(步骤6、6.1、6.2、6.3)。
6.在每个任务(mapper/reducer)中,与表或中间输出关联的反序列化器用于从HDFS文件中读取行,这些行通过关联的算子树传递,
生成输出后,通过序列化程序将其写入临时HDFS文件(如果操作不需要reduce阶段,这种情况会在mapper中发生)。
临时文件向计划后续的map/reducer阶段提供数据。
7.对于DML操作,最后一个临时文件被移动到表的位置。
该方案用于保证不读取脏数据(文件重命名在HDFS中是原子操作)。
8.对于查询,执行引擎直接从HDFS读取临时文件的内容,作为驱动程序[DRIVER]获取调用的一部分(步骤7、8、9)。



