Hive调优相关总结

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
前言
  • 我们都知道Hive默认的执行引擎是MR,在没有对Hive执行引擎改造之前(如HDP的TEZ,Hive on Spark项目),我们对Hive的调优依然只能围绕Hive本身支持的如存储格式,压缩,参数,SQL语句等方面的优化做出考虑。
存储与压缩
  • 关于Hive存储格式和压缩方式的选择和使用,这里就不再做介绍,请参考以前博客存储格式压缩方式
Hive 调优参数
  • 因为Hive的默认执行引擎为MR,所以基于Hive的参数调优,主要还是MR的参数调优以及Hive客户端的一些设置

  • 1.开启Hive map阶段及reduce压缩参数
    在MR中使用压缩需要从输入,中间,输出三个阶段去选择不同的压缩方式,输入阶段可能更看重的是数据是否支持split,支持split可以增加Map输入个数而增加计算并行度,如选择可分割的Bzip2和Lzo(Lzo压缩格式要建立索引),中间map输出要考虑下阶段reduce输入带来的压缩与解压CPU时间开销,如选择压缩解压速率较快的Snappy,最终输出如果不作为其他依赖任务的输入,更加考虑的是磁盘存储上的开销,如选择高压缩比的Bzip2

开启map阶段使用压缩参数:

set hive.exec.compress.intermediate=true
set mapred.map.output.compression=true
set mapred.map.output.compression.codec= org.apache.hadoop.io.compress.SnappyCodec

开启reduce最终输出使用压缩参数:

set hive.exec.compress.output=true 
set mapred.output.compression=true 
set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec
set mapred.output.compression.type=BLOCK
  • 2.设置Map与Reduce个数增加并行
    Map输入个数是根据split size大小来划分,默认是一个block块一个map,若单个文件小于一个block大小,那个也会作为一个map输入,MapReduce计算split size 大小是由computeSplitSize函数算出:

      protected long computeSplitSize(long blockSize, long minSize,
                                        long maxSize) {
          return Math.max(minSize, Math.min(maxSize, blockSize));
        }
    

    可以看出,当最大值设置大于一个块大小时,split size为一个block大小,若想增加map输入并行度,则需设置最大值小于一个block,反之,若想减少map输入并行度,则需设置最小值大于一个block大小

参数设置:

 set mapred.max.split.size=xxx
 set mapred.min.split.size=xxx
 set mapred.min.split.size.per.node=xxx
 set mapred.min.split.size.per.rack=xxx
 也可直接设置map数和reduce数
 set mapreduce.job.maps(mapred.map.tasks)=n
 set mapreduce.job.reduces(mapred.reduce.tasks)=n
 若不设置reduce个数,Hive将自己去计算Reduce个数(默认为-1),
 由以下参数控制:
 set hive.exec.reducers.bytes.per.reducer=xxx
 set hive.exec.reducers.max=n
  • 3.hive.fetch.task.conversion:
    fetch task 为执行hive时,不用执行MapReduce,如select * from emp;

参数设置:

Hive.fetch.task.conversion 默认为minimal
修改配置文件hive-site.xml
<property>
  <name>hive.fetch.task.conversion</name>
  <value>more</value>
  <description>
    Some select queries can be converted to single FETCH task 
    minimizing latency.Currently the query should be single 
    sourced not having any subquery and should not have
    any aggregations or distincts (which incurrs RS), 
    lateral views and joins.
    1. minimal : SELECT STAR, FILTER on partition columns, LIMIT only
    2. more    : SELECT, FILTER, LIMIT only (+TABLESAMPLE, virtual columns)
  </description>
</property> 
 
 或者当前session修改
hive> set hive.fetch.task.conversion=more;
执行SELECT id, money FROM m limit 10; 不走mr
  • 4.并行执行:
    并行执行一个作业的多个stage

参数设置:

set hive.exec.parallel=true
set hive.exec.parallel.thread.number=8
  • 5.JVM重用
    JVM重用对hive的性能具有非常大的 影响,特别是对于很难避免小文件的场景或者task特别多的场景,这类场景大多数执行时间都很短。jvm的启动过程可能会造成相当大的开销,尤其是执行的job包含有成千上万个task任务的情况

参数设置:

set mapred.job.reuse.jvm.num.tasks=n
  • 6.开启推测执行
    推测执行即一个map或reduce因为物理因素在某个节点执行的很慢,会在其他性能较好的节点启动一个相同的任务去执行,原有任务和新任务谁先执行完毕,就把较慢的kill掉

参数设置:

set mapreduce.map.speculative=true
set mapred.map.tasks.speculative.execution=true
set mapreduce.reduce.speculative=true
set mapred.reduce.tasks.speculative.execution=true
  • 7.启用map join:
    Map Join是大表关联小表时的优化选择,是将小表在每一个节点生成相应的Hashtable,这样在关联时就没有Shuffle阶段带来的网络和磁盘IO开销

参数设置:

set hive.auto.convert.join=true
hive.auto.convert.join.noconditionaltask.size=xxx
  • 8. SMB join:
    Sort -Merge -Bucket Join 对大表连接大表的优化,用桶表的概念来进行优化。在一个桶内发送生笛卡尔积连接(需要是两个桶表进行join)

参数设置:

set hive.auto.convert.sortmerge.join=true;  
set hive.optimize.bucketmapjoin = true;  
set hive.optimize.bucketmapjoin.sortedmerge = true;  
set hive.auto.convert.sortmerge.join.noconditionaltask=true;  
  • 9.谓词下推(PPD)
    即谓词下压到最底层,减少数据处理量(默认开启)

参数设置:

set hive.optimize.ppd=true
  • 10.Map端预聚合
    启用Map端聚合可降低数据倾斜情况下带来的影响

参数设置:

set hive.map.aggr=true
  • 11.小文件处理
    小文件的产生有三个地方,map输入,map输出,reduce输出,小文件过多也会影响hive的分析效率

参数设置:

//输入
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat
//map 输出
set hive.merge.mapfiles = true
//reduce 输出
set hive.merge.mapredfiles = true
//小文件阈值
set hive.merge.smallfiles.avgsize=xxx
//最终合并文件大小
set hive.merge.size.per.task=256*1024*1024
  • 12.数据倾斜
    表现:任务进度长时间维持在99%(或100%),查看任务监控页面,发现只有少量(1个或几个)reduce子任务未完成。因为其处理的数据量和其他reduce差异过大

Group by 导致的数据倾斜
当选项设定为true,生成的查询计划会有两个MR Job。当第一个MR Job中,Map的输出结果结合会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果。这样处理的结果是相同的Group By Key有可能被分发到不同的Reduce中,从而达到负载均衡的目的。第二个MR Job再根据预处理的数据结果按照Group By Key分布到reduce中,这个过程可以保证相同的key被分到同一个reduce中,最后完成最终的聚合操作
参数设置:

set hive.groupby.skewindata=true
  • 13.资源配置(内存)
    合理的设置Map 和 Reduce 分配内存大小可以增加计算效率

参数设置:

set mapreduce.map.memory.mb=4096
set mapreduce.reduce.memory.mb=8192

SQL 优化
  • where条件优化
    优化前(关系数据库不用考虑会自动优化):
    select m.cid,u.id from order m join customer u on( m.cid =u.id )where m.dt=‘20180808’;
    优化后(where条件在map端执行而不是在reduce端执行):
    select m.cid,u.id from (select * from order where dt=‘20180818’) m join customer u on( m.cid =u.id);

  • union优化
    尽量不要使用union (union 去掉重复的记录)而是使用 union all 然后在用group by 去重

  • count distinct优化
    尽量不要使用count (distinct cloumn) ,使用子查询

      select count(1) from (select id from tablename group by id) tmp
    
  • 用in 来代替join
    如果需要根据一个表的字段来约束另为一个表,尽量用in来代替join

      select id,name from tb1  a join tb2 b on(a.id = b.id);
      select id,name from tb1 where id in(select id from tb2); in 要比join 快
    
  • 善用explain查看抽象语法树(DAG)

Hive 性能大全 阅读详情

相关推荐

Hive

摘要:hive

分享~ 3422

Hive的十四种方式:

Hive的十四种方式: 第一种方式:fetch(hive可以避免MapReduce)对于hive可以简单地读取employee对应的储存目录下的文件,然后输出查询结果到控制台.修改hive.fetch.task.conversion默认是more,老版本为minimal,修改为more即可 第二种:本地模式(在hive输入数据量是非常小的情况下,可以通过本地模式处理单台机器上所有的任务,...

weixin_43662454的博客 1384

基于CDH 6.3.0 搭建 Hive on Spark 及相关配置和

但是这样有个问题是当集群有多个用户运行Hive查询时会有问题,应避免为每个用户的会话分配固定数量的executor,因为executor分配后不能回其他用户的查询使用,如果有空闲的executor,在生产环境中,计划分配好executor可以更充分的利用Spark集群资源。启动并发GC周期时的堆内存占用百分比. G1之类的垃圾收集器用它来触发并发GC周期,基于整个堆的使用率,而不只是某一代内存的使用比. 值为 0 则表示"一直执行GC循环". 默认值为 45.​。本集群分别设置为3G和1G。

十八闲客的博客,专注于大数据运维 2771

Hive方法

HIVE提供了EXPLAIN命令来展示一个查询的执行计划,这个执行计划对于我们了解底层原理,hive,排查数据倾斜等很有帮助参数说明EXTENDED加上extended可以输出有关计划的额外信息。这通常是物理信息,例如文件名。这些额外信息对我们用处不大CBO输出由Calcite化器生成的计划。CBO从hive4.0.0版本开始支持AST输出查询的抽象语法树。AST在hive2.1.0版本删除了,存在bug,转储AST可能会导致OOM错误,将在4.0.0版本修复。......

meng_xin_true的博客 2617

Hive大全

创建表时,特别是宽表,尽量使用 ORC、ParquetFile 这些列式存储格式,因为列式存储的表,每一列的数据在物理上是存储在一起的,Hive查询时会只遍历需要列数据,大大减少处理的数据量。在分布式集群环境下,因为程序Bug(包括Hadoop本身的bug),负载不均衡或者资源分布不均等原因,会造成同一个作业的多个任务之间运行速度不一致,有些任务的运行速度可能明显慢于其他任务(比如一个作业的某个任务进度只有50%,而其他所有任务已经运行完毕),则这些任务会拖慢作业的整体执行进度。但是不推荐使用这个语法。

qq_36864672的博客 998

Hive压缩配置相关

一、Hadoop压缩配置 修改Hadoop集群具有Snappy压缩方式: 查看hadoop支持的压缩方式 [kris@hadoop101 datas]$ hadoop checknative 将编译好的支持Snappy压缩的hadoop-2.7.2.tar.gz包导入到hadoop101的/opt/software中 1.解压hadoop-2.7.2.tar.gz到当前路径   [kr...

JacksonKing的专栏 403

Hive性能相关参数整理

阿斯顿撒

qq_34599449的博客 729

Hive化-hive性能相关

1.概述 hive化是个很复杂的工作,如果化做的好,可以将任务运行时间缩短几倍甚至10几倍。在化之前,需要对mapreduce任务的运行过程有个大概的认知,也需要对任务本身有个大致的了解,才能更好的根据任务运行情况(主要通过日志分析)来进行工作。以下是一些常见的手段,可以尝试以下。 2.学会使用explain [extend] 该关键字可以打印hive将查...

weixin_44224310的博客 265

hive on spark 相关

为解决hive on spark 在生产环境中的常见故障,以及hive on spark的强大,特从以下十点对hive on spark 进行

qq_65967263的博客 1379

hive相关操作

hive参数设置范围:配置文件参数>命令行参数>set参数声明hive参数设置先级:set参数声明>命令行参数>配置文件参数注意:一般执行SQL需要指定的参数,都通过set参数声明,因为它属于临时设置,断开就失效了。

MSJ3917的博客 124

hive一次查询多个分区表_《Hive用户指南》- Hive性能相关

Hive针对的应用场景是OLAP,通常对大数据集进行查询等操作,很多SQL要运行几十分钟到几个小时。因此我们在使用Hive时,要注意对SQL的性能进行,主要包括两点——避免时间复杂度过高的SQL避免数据倾斜问题针对Hive的性能,本文分为4个部分介绍,包括——数据模型相关的知识点特定场景下的化配置相关化常见数据倾斜解决方案1. 数据模型相关对于Hive中的表,可以建立为分区表或桶表,...

weixin_33841498的博客 4531

Hive相关知识

介绍 首先,我们来看看Hadoop的计算框架特性,在此特性下会衍生哪些问题? 数据量大不是问题,数据倾斜是个问题。 jobs数比较多的作业运行效率相对比较低,比如即使有几百行的表,如果多次关联多次汇总,产生十几个jobs,耗时很长。原因是map reduce作业初始化的时间是比较长的。 sum,count,max,min等UDAF,不怕数据倾斜问题,hadoop在map端的汇总合并化,使数据倾...

qq_33265875的博客 324

hive3.x安装tez和相关参数

hive3.x安装tez - 编译Tez0.10.1 下载tez的src.tar.gz源码包 新版的tez0.10.1需要在github下载,附链接 https://github.com/apache/tez 需要在pom.xml中更改hadoop.version属性的值,以匹配所使用的hadoop分支的版本。我这里是Apache Hadoop 3.1.3 vim pom.xml修改 修改guava版本hadoop 3.1.3使用的guava版本是27.0-jre 安装git—>yum instal

weixin_42438913的博客 1310

Hive 相关总结(持续更新)

1)fetch抓取: Hql中的某些查询可以不使用MR计算,例如select * from table;这种情况下Hive可以简单读取table对应的存储目录下的文件 具体的操作方式:在hive/conf/hive-default.xml文件中,修改hive.fetch.task.conversion(minimal和more)为more,这样全局查找,字段查找,filter查找,limit查找等都不走MR,直接Fetch 相关hive.fetch.task.conversion 之 minimal

weixin_41346635的博客 255

hive能替代oracle_Hive程序相关规范有助于

点击关注上方“知了小巷”,设为“置顶或星标”,第一时间送达干货。 一份拥有良好代码风格的程序,有助于开发者发现性能问题,缩短的时间,降低维护成本,同时也能促进程序员的自我提高。规范分为三类:开发规范、设计规范和命名规范。>开发规范# 单条SQL长度不宜超过一屏。# 少用或者不用Hint,特别是在Hive2.0后,增强HiveSQL对于成本(CBO)的支持,在业务环...

weixin_39710179的博客 175

Hive程序相关规范-有助于

一份拥有良好代码风格的程序,有助于开发者发现性能问题,缩短的时间,降低维护成本,同时也能促进程序员的自我提高。 规范分为三类:开发规范、设计规范和命名规范。 </>开发规范 # 单条SQL长度不宜超过一屏。 # 少用或者不用Hint,特别是在Hive2.0后,增强HiveSQL对于成本(CBO)的支持,在业务环境变化时可能会导致Hive无法选用最的执行计划。 # 避免SQL代码的复制、粘贴。如果有多处逻辑一致的代码,可以将执行结果存到临时表中。 # 尽可能使用SQL..

越是学习的人,越能清醒地认识自身的局限,不断拓宽自己的路 568

【大数据之Hive】二十、Hive相关配置及Explain查看执行计划

执行计划简单来说就是一个SQL语句最终翻译成多少个MapReduce,Map里做了什么,Reduce里做了什么。Explain显示的执行计划,由一系列Stage(整个执行计划的一个阶段,一条SQL语句会把整个阶段分为若干个执行计划)组成,Stage具有依赖关系,每个Stage对应一个MapReduce Job,或者一个文件系统操作等。

阿宁的博客 678

Hive内核(二)

SQL过程中需要结合Hive日志分析性能瓶颈,如下是对关键日志进行说明。

weixin_47884711的博客 1563
上一篇: Sqoop增量导入导出总结
下一篇: Hue导出xls,csv查询文件bug
banana`
博客等级 码龄9年 288粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值