Hive性能调优考量

news2025/1/4 10:10:16

Hive作为大数据领域常见的数据仓库组件,在设计和开发阶段需要注意效率。影响Hive效率的不仅仅是数据量过大,数据倾斜、job(小文件过多)或者磁盘I/O过多、MapReduce分配不合理等因素都会对Hive的效率有影响。对Hive的调优可以从架构优化、参数优化以及Hive SQL优化三个方面考虑。

一、架构优化

1、执行引擎

Hive支持多种执行引擎,例如:MR、Tez、Spark等。可以通过hive-site.xml文件中的hive.execution.engine属性配置。

也可以命令行临时切换Hive引擎(MR、Tez、Spark):

1. MapReduce计算引擎(默认)
set hive.execution.engine=mr;
2. Tez引擎
set hive.execution.engine=tez;
3. Spark计算引擎
set hive.execution.engine=spark;

2、优化器

与关系型数据库类型,Hiv在真正执行的时候,会先通过解释器生成AST抽象语法树,然后再通过编译器生成逻辑执行计划,再通过优化器进行优化,优化后通过执行器生成物理执行计划。而Hive有两种优化器:
Vectorize(矢量化优化器)和Cost-Based Optimization(CBO成本优化器)

1)矢量化查询优化(向量化优化器)

矢量化查询执行通过一次批量执行1024行,而不是一行一行来提高扫描、聚合、过滤器和链接等操作的性能,这个功能明显缩短查询执行时间。

-- 默认 false
SET hive.vectorized.execution.enabled = true; 
-- 默认 false
SET hive.vectorized.execution.reduce.enabled = true; 

备注:
● 要使用矢量化查询执行,必须用ORC格式存储数据
● 要求执行引擎为Tez

2)成本优化器

Hive的CBO是基于Apache Calcite的,Hive的CBO通过查询成本(有analyze收集的统计信息)会生成有效率的执行计划,最终会较少执行的时间和资源利用,使用CBO的配置如下:

--从 v0.14.0默认为true
SET hive.cbo.enable=true;
-- 默认false 
SET hive.compute.query.using.stats=true; 
-- 默认false
SET hive.stats.fetch.column.stats=true; 
-- 默认true
SET hive.stats.fetch.partition.stats=true;

定期执行表(分析的命令:analyze)的分析,分析后的数据放在元数据库中。
低版本情况下,小表在前的确效率高,高版本优化器已经做了优化。是因为小表的数据可能会放在内存里面,达标的数据内存存不下就会导致效率低。

3、分区表

对于一个比较大的表,将其设计为分区表,可以提升查询的性能,对于一个特定分区的查询,只会加载对应分区路径的数据文件,所以执行速度比较快。

分区字段的选择,避免层级较深的分区,否则会造成太多的子文件夹,常见的分区字段:

  • 日期或时间。如year、month、day或者hour,当表中存在时间或者日期字段时。

  • 地理问题。如:国家、省份、城市等。

  • 业务逻辑。如:部门、销售区域、客户等等。

4、分桶表

与分区表类似,分桶表的组织方式是将HDFS上的文件分割成多个文件。

分桶可以加快数据采样,也可以提高join的性能,join的字段是分桶字段,因为分桶可以确保某一个key对应的数据在一个特定的桶内(文件),巧妙的选择分桶字段,可以大幅度提升join性能。

通常情况下,分桶字段可以选择经常用过滤操作或者join操作的字段。

5、文件格式

在Hive SQL的创表语句中,可以使用 stored as... 指定表的存储格式。Hive表支持的存储格式有TextFile、SequenceFile、RCFile、ORC、Parquet等。

存储格式一般需要根据业务进行选择,生产环境中绝大多数表都采用TextFile、ORC、Parquet存储格式之一。

  • TextFile是最简单的存储格式,它是纯文本记录,也是Hive默认格式。其磁盘开销大,查询效率低,更多的是作为跳板来使用。RCFile、ORC、Parquet等格式的表都不能由文件直接导入数据,必须由TextFile来做中转。
  • Parquet和ORC都是开源列式存储格式。列式存储比起传统的行式存储更适合批量OLAP查询,并且也支持更好的压缩和编码。选择Parquet的原因主要是它支持Impala查询引擎,并且对update、delete和事务性操作需求很低。

6、数据压缩

压缩技术可以减少map与reduce之间的数据传输,从而可以提升查询性能,关于压缩的配置可以在hive命令行中或者hive-site.xml文件中进行配置。

-- 默认式false
SET hive.exec.compress.intermediate=true

开启压缩后,可以选择下面的压缩格式:

关于压缩的编码器可以通过mapred-site.xml,hive-site.xml进行配置,也可以通过命令行进行配置,如:

-- 中间结果压缩
SET hive.intermediate.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
-- 输出结果压缩
SET hive.exec.compress.output=true;
SET mapreduce.output.fileoutputformat.compress.codec = org.apache.hadoop.io.compress.SnappyCodc

二、参数优化

1、本地模式

当Hive处理的数据量较小的时候,启动分布式处理数据就会显得浪费,因为可能启动时间比处理数据时间还要长,Hive支持将作业动态的转为本地模式,需要使用下面的配置:

-- 默认 false
SET hive.exec.mode.local.auto=true; 
-- 默认128M
SET hive.exec.mode.local.auto.inputbytes.max=50000000; 
 -- 默认 4
SET hive.exec.mode.local.auto.input.files.max=5;

一个作业只要满足下面的条件,会启动本地模式:

  • 输入文件的大小小于 hive.exec.mode.local.auto.inputbytes.max 配置的大小;

  • map任务的数量小于 hive.exec.mode.local.auto.input.files.max 配置的大小;

  • reduce任务的数量是1或者0。

2、严格模式

所谓严格模式就是不允许执行3种有风险的HQL语句:

  1. 查询分区表的时候不限定分区列的语句

  2. 两个表join产生了笛卡尔积

  3. 用order by 来排序,但是没有指定limit

要开启严格模式,需要将参数要开启严格模式,需要将参数 hive.mapred.mode 设为strict(缺省值)。

该参数可以不在参数文件中定义,在执行SQL之前设置(set hive.mapred.mode=nostrict),即在当前SQL不是严格模式。

3、JVM重用

默认情况下,Hadoop会为一个map或者reduce启动一个JVM,这样可以并行执行map和reduce。当map或者reduce是那种仅运行几秒钟的轻量级作业时,JVM启动进程所耗费的时间会比作业执行的时间还要长。Hadoop可以重用JVM,通过共享JVM以串行而非并行的方式运行map或者reduce。

JVM的重用适用于同一个作业的map和reduce,对于不同作业的task不能够共享JVM。如果要开启JVM重用,需要配置一个作业最大task数量,默认值为1,如果设置为-1,则表示不限制:

-- 代表同一个MR job中顺序执行的5个task重复使用一个JVM,减少启动和关闭的开销 
SET mapreduce.job.jvm.numtasks=5;

这个功能的缺点是,开启JVM重用将一直占用使用到的task插槽,以便进行重用,直到任务完成后才能释放。如果某个“不平衡的”job中有某几个reduce task执行的时间 要比其他Reduce task消耗的时间多的多的话,那么保留的插槽就会一直空闲着却无 法被其他的job使用,直到所有的task都结束了才会释放。

4、并行执行

Hive的查询通常会被转换成一系列的stage,这些stage之间并不是一直相互依赖的,可以并行执行这些stage,通过下面的方式进行配置:

SET hive.exec.parallel=true; -- 默认false
SET hive.exec.parallel.thread.number=16; -- 默认8

并行执行可以增加集群资源的利用率,如果集群的资源使用率已经很高了,那么并行执行的效果不会很明显。

5、推测执行

在分布式集群环境下,因为程序Bug、负载不均衡、资源分布不均匀等原因,会造成同一个作业的多个任务之间运行速度不一致,有些任务的运行速度可能明显慢于其他任务(比如一个作业的某个任务进度只有50%,而其他所有任务已经运行完成),则这些任务会拖慢作业的整体执行进度。

为了避免这种情况发生,Hadoop采用了推测执行机制,它根据一定的规则推测出“拖后腿”的任务,并为这样的任务启动一个备份任务,让该任务与原始任务同时处理同一份数据,并最终选用最先成功运行完成任务的计算结果作为最终结果。

set mapreduce.map.speculative=true
set mapreduce.reduce.speculative=true
set hive.mapred.reduce.tasks.speculative.execution=true

6、合并小文件

  • 在map执行前合并小文件,减少map数
-- 缺省参数
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
  • 在Map-Reduce的任务结束时合并小文件
-- 在 map-only 任务结束时合并小文件,默认true 
SET hive.merge.mapfiles = true;
-- 在 map-reduce 任务结束时合并小文件,默认false 
SET hive.merge.mapredfiles = true;
-- 合并文件的大小,默认256M
SET hive.merge.size.per.task = 268435456;
-- 当输出文件的平均大小小于该值时,启动一个独立的map-reduce任务进行文件merge 
SET hive.merge.smallfiles.avgsize = 16777216;

7、Fetch模式

Fetch模式是指Hive中对某些情况的查询可以不必使用MR计算,select col1, col2 from tab;

可以简单地读取表对应的存储目录下的文件,然后输出查询结果到控制台,在开启Fetch模式之后,在全局查找、字段查找、limit查找等都不启动MR。

-- Default Value: minimal in Hive 0.10.0 through 0.13.1, more in Hive 0.14.0 and later
set hive.fetch.task.conversion=more

三、HiveSQL优化

1、列裁剪和分区裁剪

最基本的操作。所谓列裁剪就是在查询时只读取需要的列,分区裁剪就是读取需要的分区。以用户维度表为例:

SELECT user_id, user_name
FROM dim_user_dd_f
WHERE dt = '2021-10-28' 
and user_level = 1

当列很多或者数据量很大时,如果select *或者不指定分区,全列扫描和全表扫描效率都很低。

Hive中与列裁剪优化相关的配置项是hive.optimize.cp,与分区裁剪优化相关的则是hive.optimize.pruner,默认都是true。在HiveSQL解析阶段对应的则是ColumnPruner逻辑优化器。

2、谓词下推

谓词下推就是将SQL语句中的where谓词逻辑都尽可能提前执行,减少下游处理的数据量。

例如,如下Hive SQL语句:

SELECT a.uid, a.event_type, b.topic_id, b.title
FROM calendar_record_log a
         LEFT OUTER JOIN
     (
         SELECT uid, topic_id, title
         FROM forum_topic
         WHERE pt_date = 20190224
           AND length(content) >= 100
     ) b ON a.uid = b.uid
WHERE a.pt_date = 20190224
  AND status = 0

对forum_topic做过滤的where语句写在子查询内部,而不是外部。Hive中有谓词下推优化的配置项hive.optimize.ppd,默认值true,与它对应的逻辑优化器是PredicatePushDown。该优化器就是将OperatorTree中的FilterOperator向上提,见下图。

3、sort by 代替 order by

HiveSQL中的order by 就是将结果按照某个字段进行全局排序,这会导致所有map端数据都进入一个reducer中,在数据量大时可能会长时间计算不完。

如果使用sort by,那么还是会视情况启动多个reducer进行排序,并且保证每个reducer内局部有序。为了控制map端数据分配到reducer的key,往往还要配合distribute by一同使用。如果不加distribute by的话,map端数据就会随机分配到reducer。

4、group by 代替 count(distinct)

当要统计某一列的去重数时,如果数据量很大,count(distinct)就会非常慢,原因与order by类似,count(distinct)逻辑只会有很少的reducer来处理。这时可以用group by来改写:

但是这样写会启动两个MR job(单纯distinct只会启动一个),所以要确保数据量大到启动job的overHead远小于计算耗时,才考虑这种方法。当数据集很小或者key的倾斜比较明显时,group by还可能会比distinct慢。

5、group by配置调整---map端预聚合

group by时,如果先起一个combine在map端做部分预聚合,可以有效减少shuffle数据量。

-- 默认为true
set hive.map.aggr = true;

Map端进行聚合操作的条目数

set hive.groupby.mapaggr.checkinterval = 100000;

通过 hive.groupby.mapaggr.checkinterval 参数也可以设置map端预聚合的行 数阈值,超过该值就会分拆job,默认值10W。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2269695.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在CodeBlocks搭建SDL2工程构建TFT彩屏模拟器虚拟TFT彩屏幕显示

在CodeBlocks搭建SDL2工程构建TFT彩屏模拟器虚拟TFT彩屏幕显示 参考文章源码下载地址一、SDL2的创建、初始化、退出二、系统基本Tick、彩屏刷新、按键事件三、彩屏获取与设置颜色四、彩屏填充颜色及清屏五、彩屏显示中文和英文字符串六、彩屏显示数字七、彩屏初始化八、主函数测…

ESLint+Prettier的配置

ESLintPrettier的配置 安装插件 ​​​​​​ 在settings.json中写下配置 {// tab自动转换标签"emmet.triggerExpansionOnTab": true,"workbench.colorTheme": "Default Dark","editor.tabSize": 2,"editor.fontSize": …

Springboot使用RabbitMQ实现关闭超时订单的一个简单示例

1.maven中引入rabbitmq的依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency> 2.application.yml中进行rabbitmq相关配置&#xff1a; # rabbit…

复杂对象的创建与组装 - 建造者模式(Builder Pattern)

建造者模式&#xff08;Builder Pattern&#xff09; 建造者模式&#xff08;Builder Pattern&#xff09;建造者模式&#xff08;Builder Pattern&#xff09;概述建造者模式结构图代码 talk is cheap&#xff0c; show you my code总结 建造者模式&#xff08;Builder Patter…

云计算课程报告实验-WordCount算法实验 过程记录

内容描述 本实验指导书通过在华为鲲鹏上&#xff0c;编译运行WordCount程序。完成实验操作后&#xff0c;读者会掌握简单的程序编写&#xff0c;如WordCount中的getWords、countWords、treeMerge。 实验环境 华为鲲鹏云主机、openEuler 20.03操作系统&#xff1b;安装mpich-3…

springboot533图书管理系统(论文+源码)_kaic

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;图书信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不能满足广…

【服务器开发及部署】code-server 显示git graph

在开发一些linux上的内容的时候进程需要在开发机和生产部署上花费大量的时间。 为了解决上述问题,我们今天介绍一款在服务上开发的思路 git + code server + 宝塔 其中需要处理一些问题,此处都有交代 步骤 安装宝塔安装code-server配置插件配置浏览器处理的问题 git版本过低,…

【游戏设计原理】41 - 游戏的核心

1. 如何理解&#xff1f; 这条原理主要在讲述“游戏核心”这一概念的重要性及其在游戏开发中的作用。游戏的核心是指决定游戏整体玩法和体验的核心元素&#xff0c;它通常是游戏的主要机制、目标或动作方式。理解这一原理时&#xff0c;我们可以从以下几个层面来考虑&#xff…

win11 vs2022 opencv 4.10 camshift示例程序运行

记录win11 vs2022 opencv 4.10下 camshift等示例程序的单步debug启动方式&#xff0c;方便了解源码。 debug版本编译通过&#xff0c;但运行时报出大量日志信息(部分dll加载FAILED后会自动找兼容dll)。但也能继续运行&#xff0c;效果如下 release版本可以直接运行&#xff0…

数据结构漫游记:初识栈(stack)

嘿&#xff0c;各位技术潮人&#xff01;好久不见甚是想念。生活就像一场奇妙冒险&#xff0c;而编程就是那把超酷的万能钥匙。此刻&#xff0c;阳光洒在键盘上&#xff0c;灵感在指尖跳跃&#xff0c;让我们抛开一切束缚&#xff0c;给平淡日子加点料&#xff0c;注入满满的pa…

人工智能知识分享第五天-正则化.损失函数案例

正则化 欠拟合与过拟合 过拟合&#xff1a;一个假设 在训练数据上能够获得比其他假设更好的拟合&#xff0c; 但是在测试数据集上却不能很好地拟合数据 (体现在准确率下降)&#xff0c;此时认为这个假设出现了过拟合的现象。(模型过于复杂) 欠拟合&#xff1a;一个假设 在训…

CSS2笔记

一、CSS基础 1.CSS简介 2.CSS的编写位置 2.1 行内样式 2.2 内部样式 2.3 外部样式 3.样式表的优先级 4.CSS语法规范 5.CSS代码风格 二、CSS选择器 1.CSS基本选择器 通配选择器元素选择器类选择器id选择器 1.1 通配选择器 1.2 元素选择器 1.3 类选择器 1.4 ID选择器 1.5 基…

如何在 Ubuntu 22.04 上优化 Apache 以应对高流量网站教程

简介 在本教程中&#xff0c;我们将学习如何优化 Apache 以应对高流量网站。 当运行高流量网站时&#xff0c;确保你的 Apache Web 服务器得到优化对于有效处理负载至关重要。在本指南中&#xff0c;我们将介绍配置 Apache 以提高性能和可扩展性的基本技巧。 为高流量网站优…

安装教程:慧集通集成平台(DataLinkX)智能体客户端安装操作(Linux/windows/mac)

1.下载客户端 使用提供的账号登录集成平台后台(https://www.datalinkx.cn/),点击左侧菜单栏【智能体】→【智能体】进入到智能体列表界面&#xff0c;在该界面我们找到功能栏中的下载按钮点击则会弹出下载界面&#xff0c;在该界面我们可以选择不同的系统操作系统来下载对应版…

Spring boot + Hibernate + MySQL实现用户管理示例

安装MySQL Windows 11 Mysql 安装及常用命令_windows11 mysql-CSDN博客 整体目录 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLS…

大模型Weekly 03|OpenAI o3发布;DeepSeek-V3上线即开源!

大模型Weekly 03&#xff5c;OpenAI o3发布&#xff1b;DeepSeek-V3上线即开源&#xff01;DeepSeek-V3上线即开源&#xff1b;OpenAI 发布高级推理模型 o3https://mp.weixin.qq.com/s/9qU_zzIv9ibFdJZ5cTocOw?token47960959&langzh_CN 「青稞大模型Weekly」&#xff0c;持…

电路学习之前言

1.作为一名嵌入式开发者&#xff0c;去学习电路是必经之路。如果是一名嵌入式软件开发者&#xff0c;可能对电路和硬件的开发要求是能看懂电路图即可&#xff0c;但是&#xff0c;学习电路可以进一步提高看电路图的能力&#xff0c;可以提升自己的整体实力水平。而且&#xff0…

Java反射详解(二)

上一篇博客&#xff1a;Java反射详解&#xff08;一&#xff09; 写在前面&#xff1a;大家好&#xff01;我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正&#xff0c;感谢大家的不吝赐教。我的唯一博客更新地址是&#xff1a;https://ac-fun.blog.c…

zentao ubuntu上安装

#下载ZenTaoPMS-21.2-zbox_amd64.tar.gz&#xff08;https://www.zentao.net/downloads.html&#xff09; https://dl.zentao.net/zentao/21.2/ZenTaoPMS-21.2-zbox_amd64.tar.gzcd /opt tar -zxvf ZenTaoPMS-21.2-zbox_amd64.tar.gz#启动 /opt/zbox/zbox start /opt/zbox/zbox…

逆境清醒文章总目录表

逆境清醒文章总目录表 零、时光宝盒&#x1f33b; &#xff08;https://blog.csdn.net/weixin_69553582 逆境清醒&#xff09; 《你的答案》歌曲原唱&#xff1a;阿冗&#xff0c;填 词&#xff1a;林晨阳、刘涛&#xff0c;谱曲&#xff1a;刘涛 也许世界就这样&#xff0c…