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表中

hive实战读书笔记(第9章)Hive性能优化相关推荐

  1. hive实战读书笔记(第4章)hive表DDL

    schema-on-read hadoop提供了存储和处理任何结构化,半结构化,非结构化数据的能力,hive允许用户在这些数据上创建一个元数据层,并使用sql接口来访问该层. hive并不是一个数据库 ...

  2. spring boot 503_Spring实战读书笔记第4章 面向切面的Spring

    本章内容: 面向切面编程的基本原理 通过POJO创建切面 使用@AspectJ注解 为AspectJ切面注入依赖 在软件开发中,散布于应用中多的功能被称为横切关注点(cross-cutting con ...

  3. jQuery实战读书笔记(第一章至第四章)

    2019独角兽企业重金招聘Python工程师标准>>> 第一章 jQuery 基础 1. 包装器 jQuery对包装器(Wrapper)或包装集(wrapped set)进行操作,即 ...

  4. maven实战--读书笔记之第一章和第二章

    第一章:Maven简介 1.本书为国内社区公认的专家徐晓斌所写,本书基于maven3.0所编写,maven是非常优秀的建模工具,maven最大化的消除了构建的重复,抽象了构建生命,他还有一个优点,帮助 ...

  5. Java8实战读书笔记-第3章 λ表达式

    可以在函数式接口上使用λ表达式,函数式接口就是只定义一个抽象方法的接口(函数式接口只可以定义一个抽象接口,但是可以定义多个默认方法). Lambda表达式允许你直接以内联的形式为函数式接口的抽象方法提 ...

  6. 做事的科学-细节与流程》读书笔记第四章(变动性优化方案)

    变动性对产能效率有很重要的影响,因此要尽量减少变动性,波动性带来的缺点,解决这种现象和问题. 但是任何一个生产流程都会有变动性,可能由内部引发或者外部引起的,绝对没有完全平衡的生产流程,因此只能优化生 ...

  7. 机器学习实战---读书笔记: 第11章 使用Apriori算法进行关联分析---2---从频繁项集中挖掘关联规则

    #!/usr/bin/env python # encoding: utf-8''' <<机器学习实战>> 读书笔记 第11章 使用Apriori算法进行关联分析---从频繁项 ...

  8. 《Spring实战》读书笔记-第4章 面向切面的Spring

    <Spring实战>是学习Spring框架的一本非常经典的书籍,之前阅读了这本书,只是在书本上写写画画,最近整理了一下<Spring实战>的读书笔记,通过博客的方式进行记录分享 ...

  9. 第55课:60分钟内从零起步驾驭Hive实战学习笔记

    第55课:60分钟内从零起步驾驭Hive实战学习笔记 本期内容: 1. Hive本质解析 2. Hive安装实战 3. 使用Hive操作搜索引擎数据实战 SparkSQL前身是Shark,Shark强 ...

最新文章

  1. eclipse 和 google拼音输入法冲突问题
  2. iphone降级_iOS 14升级体验与问题总结,附降级教程
  3. js事件触发器fireEvent和dispatchEvent
  4. GetWindowRect和GetClientRect(得到窗口坐标)
  5. monty python flying circus-巨蟒剧团之飞翔的马戏团 第一季
  6. hdu1466 计算直线的交点数
  7. Undo TableSpace ②.回滚段研究
  8. Python字符的转义
  9. HTML和CSS精要基础知识整理
  10. 黑马程序员—18-oc协议与block
  11. android中include标签使用详解
  12. Linux——常用工具
  13. mysql 过滤微信昵称表情符号_js 过滤微信昵称的表情符号
  14. Eclipse如何从官网获取历史版本
  15. 使用什么软件可以将PDF文件进行编辑
  16. linux中文显示乱码情况解决
  17. CentOS7 DNS 设置
  18. 【联邦学习FATE框架实战】(二)用FATE从零开始实现横向逻辑回归
  19. Signal ()函数详细介绍 Linux函数
  20. zcu102出现运行可执行程序时出现的错误

热门文章

  1. 【Python-2.7】换行符和制表符
  2. 阿里云虚拟主机安装wordpress,提示连接数据库失败的解决方法
  3. ajax的content-download时间过慢问题的解决与思考
  4. chrome浏览器 提示Adobe Flash Player未安装的解决方法
  5. POI操作Excel时Cannot get a text value from a numeric formula cell非法参数异常
  6. usr / bin / ld:找不到-l <nameOfTheLibrary>
  7. 为什么2 *(i * i)比Java中的2 * i * i更快?
  8. 从Android应用程序访问Internet需要什么权限?
  9. win11虚拟内存如何设置 Windows11设置虚拟内存的步骤方法
  10. 堡垒机应用发布服务器是干嘛的_支持Web UI数据库审计和敏感数据国密算法加密,JumpServer堡垒机v2.5.0发布丨Release Notes...