hive用户面临的一个比较大的问题是,用户需要等待较长的响应时间,与传统关系数据库查询的性能相比,hive响应速度慢的令人发指
本章介绍一套诊断改进hive查询性能的系统方法,通过这个过程,将单个hive查询的执行时间从475秒缩短到49s
执行引擎
hive目前支持3种执行引擎,每种引擎都各有优缺点,默认的引擎由hive-site.xml文件中的hive.execution.engine属性控制,也可以运行时修改该属性的值,根据具体查询重写此设置.下来对比mr和tez
mapreduce
传统的mr作业执行hive查询,他是最初的执行引擎,如果查询不能通过其他的引擎来执行,他是最安全的后备,将hive.execution.engine设置成mr可以选择该执行引擎
tez
通过减少操作和限制写入磁盘的中间数据量,apache tez提供比mr更高的效率,tez的执行计划中,将约简器的中间数据直接传递给下一个约简器,省去了将数据写入磁盘的开销.
属性 | 取值 | 用途 |
---|---|---|
hiveserver堆的大小 | 16GB | 默认1G,在此基础上增加 |
hive.prewarm.enable | true | 告诉hive创建tez容器 |
hive.prewarm.numcontainers | 不同数值 | 调整tez专用容器数量 |
TEZ_CONTAINER_MAX_JAVA_HEAP_FRACTION | 0.8 | Tez容器的规模是YARN容器规模的倍数 |
hive.auto.convert.join.nonconditionaltask.size | 不同数值 | 调整映射连接的规模 |
存储格式
有些文件格式专门针对Hive使用进行了优化,ORC文件和Parquet文件,两种文件都旨在减少查询期间从磁盘读取的数据量,从而提高查询的总体性能.
ORC文件
ORC(optimized Row columnar)格式是一种基于列的存储格式,它并不是按单个数据行连续的将全部的数据存储在磁盘上,而是按每列连续存储数据,针对不需要某列的查询,可以避免不必要的磁盘访问,可以跳过那些在结果中不需要的大部分数据
ORC格式是一种可以分割的文件格式,意味着一个文件可以被分割成多个可以并行处理的块.每个数据块被进一步细分为256MB的数据带,这些数据带则用于将列数据存储在一起,不需要查询某个列的时候可以直接跳过这个数据带.
parquet格式
parquet格式是另一种基于列的存储格式,也将每列的所有数据连续存储在磁盘上,与ORC类似的性能优势,实测结果比ORC带来的性能提高少一些
矢量化查询执行
hive的默认查询执行引擎一次处理一行,因此在嵌套循环中需要有多层虚拟方法调用,从cpu视角是非常低效的,矢量化查询是一种hive特性,其目的是按照每批1024行读取数据,并且一次性对整个记录集合而不是单条记录应用操作,进而消除那些效率低下的问题.
要使用这种优化,必须是ORC格式存储
查询执行计划
hive驱动程序负责将sql语句转换为针对目标执行引擎的执行计划
sql提交到解析器,解析器根据表名去规划器,调用hive metastore查询表的元数据,解析器生成逻辑运算树,查询优化器拿到这些数据,生成物理运算树,调用执行引擎进行执行
- 解析器:解析sql生成一个抽象语法树(abstract syntax tree AST),描述了为生成正确的结果集所必须执行的逻 辑运算
- 规划器:从hive metastore中检索表的元数据,包括hdfs文件位置,存储格式,行数等
- 查询优化器:使用AST和表的元数据,生成物理运算树,所谓的执行计划,描述了为检索数据所必须执行的所有的物理运算,查询优化器生成的执行计划最终决定了再hadoop集群中执行的任务,所以对数据分析系统(如hive)的性能影响最大,因为生成正确的执行计划和错误的执行计划,可能就意味着几秒到几个小时的差别
利用表的统计信息,基于代价的优化可以帮助hive驱动程序生成一个最优的执行计划,在性能代价方面对其生成的每个可能的执行计划作出明智的决策
基于代价的优化
基于代价的优化(cost-based optimization CBO)引擎利用了hive metastore的统计数据来差生最优的查询计划,用于优化统计信息有两种类型:一种是表统计信息,包括表的未压缩大小,行数和用于存储数据的文件数;另一种是列统计信息,其中包括NDV(唯一值的个数)和最小,最大值,计数值
CBO进行了连接重排,改进了针对星型连接模式和浓密连接模式的计划,并提供了基于样本查询的改进机会
缺点是必须收集和维护正确的表统计信息,以使基于代价的优化引擎变得有效,遗憾的是表统计信息收集是一项开销很大的操作,但对于那些收集了统计信息的表而言,所有后续查询都可以从中获益.设置hive.stats.autogather,还有一些其他的参数
hive的explain
explain命令的输出包括3个部分,该查询的抽象语法树,该计划不同阶段之间的依赖关系,以及每个阶段的描述
执行计划
CBO帮我们生成了一个最优的执行计划,计划的执行过程中,从硬盘的读取和处理的数据量已经尽可能早的减少,是整个工程更加高效
性能检查表小结
通过使用tez,ORC存储格式,矢量化查询执行,CBO引擎等技术减少执行时间,只需要少量的工作量就可以将大多数技术都用到现在的大多数hive表中