Hive介绍
Hive工作流
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。
图1 Hive工作流

流程大致步骤为:
- 用户提交查询等任务给Driver。
- 编译器获得该用户的任务Plan。
- 编译器Compiler根据用户任务去MetaStore中获取需要的Hive的元数据信息。
- 编译器Compiler得到元数据信息,对任务进行编译,先将HiveQL转换为抽象语法树,然后将抽象语法树转换成查询块,将查询块转化为逻辑的查询计划,重写逻辑查询计划,将逻辑计划转化为物理的计划(Tez),最后选择最佳的策略。
- 将最终的计划提交给Driver。
- Driver将计划Plan转交给ExecutionEngine去执行,获取元数据信息,提交给JobTracker或者SourceManager执行该任务,任务会直接读取HDFS中文件进行相应的操作。
- 获取执行的结果。
- 取得并返回执行结果。
从上面的流程可以看出,影响Hive执行的主要有两部分:
- 编译器任务编译。这部分会直接影响查询计划,不同的查询计划影响实际的物理计划(TEZ)。
- Tez引擎。这个是Hive任务的主体。
Tez引擎
Tez是基于Hadoop YARN之上的DAG(Directed Acyclic Graph)计算框架。Tez直接源于MapReduce框架,核心思想是将Map和Reduce两个操作进一步拆分,即Map被拆分成Input、Processor、Sort、Merge和Output, Reduce被拆分成Input、Shuffle、Sort、Merge、Processor和Output等,被分解后的元操作可灵活组合,产生新的操作,这些操作经一些控制程序组装后,可形成一个大的DAG作业。采用Tez计算框架,生成一个简洁的DAG作业,算子跑完不退出,下轮继续使用上一轮的算子,这样大大减少磁盘IO操作,从而计算速度更快。
总结起来,Tez有以下特点:
- 运行在YARN之上。
- 与MapReduce兼容,继承了MapReduce的各种优点(比如良好的扩展性与容错性)。
- 适用于DAG应用场景。
Tez在底层提供了DAG编程接口,用户利用这些接口进行程序编写,其主要由两部分组成:数据处理引擎和DAGAppMaster,其中数据处理引擎为其提供了一套编程接口和数据计算操作符,而DAGAppMaster则是一个YARN ApplicationMaster,它使得Tez应用程序可运行在YARN上。
简单举例演示,例如以下Hive SQL会翻译成四个MR作业,而采用Tez则生成一个DAG作业,可大大减少磁盘IO。
父主题: 调优概述