Hive学习笔记(3)——执行过程
Hive主要组件
- Driver组件:包括Complier(编译器)、Optimizer(优化器)和Exector(执行器),是Hive的核心组件。
- Metastore组件:存储Hive的元数据,存储在关系型数据库中,包括Derby和MySQL。
- CLI:命令行接口。
- Thrift Server:用于可扩展、跨语言的服务开发。
- Hive Web Interface:提供网页的方式访问Hive服务。
Hive基本执行过程
- Hive将HQL转换成一组操作符,这些操作符是Hive的最小单元。
- 每个操作符代表一个HDFS操作或者MapReduce作业,如
GroupByOperator
,JoinOperator
等。 - Hive通过
ExecMapper
和ExecReducer
执行MapReduce程序,执行模式有本地模式和分布式两种模式。 - 本地模式在单机上处理所有任务,适合小数据集,效率比提交到集群处理高很多。任务需要满足:
- job输入数据小于
hive.exec.mode.local.auto.inputbytes.max
(默认为128MB); - job的Map数小于
hive.exec.mode.local.auto.tasks.max
(默认为4); - job的Reduce数必须为0或者1。
- job输入数据小于
Hive执行计划
- 读取元数据信息,对SQL进行词法和语法分析,检查表、字段是否存在,SQL是否有误;
- 将SQL转换成抽象语法树
AST
,然后将其转换为查询块Query Block
,进一步抽象和结构化; - 遍历
Query Block
,生成Operator Tree
; - 逻辑层优化器变换
Operator Tree
,合并不必要的ReduceSinkOperator
,减少Shuffle数量; - 生成物理执行计划,遍历
Operator Tree
,翻译为MapReduce任务; - 物理层优化器进行MapReduce任务的变换,生成最终的执行计划。
SELECT执行过程
输入分片
- 按照分区条件,读取对应分区的文件。
- 根据分片大小(Hadoop1.x默认是64MB,Hadoop2.x默认是128MB),对文件进行分片。
Map阶段
- 根据分片数量,启动对应数量的Map任务。
- 每个Map任务仅对自己的分片进行检查。
- 所有Map任务并行执行,只需增加相应的机器和节点,就能在相同时间内处理更多的数据。
Shuffle和Reduce阶段
SELECT
操作不涉及数据的重新分发和分布,不需要启动任何的Reduce任务。
输出文件
- Hadoop合并Map任务输出文件到输出目录。
GROUP BY执行过程
输入分片
- 按照分区条件,读取对应分区的文件。
- 根据分片大小,对文件进行分片。
Map阶段
- 根据分片数量,启动对应数量的Map任务。
- 每个Map任务检查对应分片中的字段名是否符合筛选条件,如果是,输出形如
<xxx, 1>
的键值对(xxx为分组条件)。
Combiner阶段
- 如果选择了
Combiner
操作,Hadoop会在Map任务的本地输出执行Combiner
,去除冗余输出。例如,一个Reducer中出现了<xxx, 1>
两次,则会合并为<xxx, 2>
。注意使用Combiner
的原则是不影响到Reduce计算的最终输入,例如求总数、求最大值等,但不适合求均值等情况。
Shuffle阶段
- Shuffle过程是把Map任务输出到Reduce任务输入的整个处理过程。
- 对于
GROUP BY
,Hadoop通过某种方法把每个输出的键值对分配到某一个Reducer进行合并。最为常用的方法是Hash Partitioner
,即Hadoop对每个键取Hash,对此Hash按照Reduce任务数量取模,得到对应的Reducer。合并后的输出形如<xxx, {2,1}>
,将其作为一个Reducer的输入。
Reduce阶段
- Reduce Task调用reduce函数逻辑将输入汇总,输出到本地文件中。
输出文件
- Hadoop合并Reduce Task任务输出文件到输出目录。
JOIN执行过程
如果JOIN
语句中存在子查询,它会被拆分成数个MapReduce任务。
输入分片
- 如果
JOIN
任务的输入是两个MapReduce任务的输出,依然会对它们根据文件大小进行分片。
Map阶段
- 根据分片数量,启动对应数量的Map任务。
Shuffle阶段
- 对于
JOIN
,Shuffle主要过程是Partition
,根据JOIN
的列进行数据的重分布和分发。常用的Partition
方法也是Hash Partitioner
。
Reduce阶段
- Reduce Task根据
JOIN
的键将它们的值关联合并成一行,写入本地的输出文件中。
输出文件
- Hadoop合并Reduce Task任务输出文件到输出目录。