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作业,如GroupByOperatorJoinOperator等。
  • Hive通过ExecMapperExecReducer执行MapReduce程序,执行模式有本地模式和分布式两种模式。
  • 本地模式在单机上处理所有任务,适合小数据集,效率比提交到集群处理高很多。任务需要满足:
    • job输入数据小于hive.exec.mode.local.auto.inputbytes.max(默认为128MB);
    • job的Map数小于hive.exec.mode.local.auto.tasks.max(默认为4);
    • job的Reduce数必须为0或者1。

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任务输出文件到输出目录。