千家信息网

Hive怎么调优

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,小编给大家分享一下Hive怎么调优,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!hive调优涉及到sql的调优,数据倾斜调
千家信息网最后更新 2026年11月03日Hive怎么调优

小编给大家分享一下Hive怎么调优,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

hive调优涉及到sql的调优,数据倾斜调优,小文件问题的调优,数据压缩的调优等

  1. 数据的压缩与存储格式

文件格式与压缩编码的选择对比

设置方式


1. map阶段输出数据压缩 ,在这个阶段,优先选择一个低CPU开销的算法。

set hive.exec.compress.intermediate=trueset mapred.map.output.compression.codec= org.apache.hadoop.io.compress.SnappyCodecset mapred.map.output.compression.codec=com.hadoop.compression.lzo.LzoCodec;

2. 对最终输出结果压缩

set hive.exec.compress.output=true set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec ## 当然,也可以在hive建表时指定表的文件格式和压缩编码

结论,一般选择orcfile/parquet + snappy 方式

2.合理利用分区、分桶

分区是将表的数据在物理上分成不同的文件夹,以便于在查询时可以精准指定所要读取的分区目录,从来降低读取的数据量

分桶是将表数据按指定列的hash散列后分在了不同的文件中,将来查询时,hive可以根据分桶结构,快速定位到一行数据所在的分桶文件,从来提高读取效率


3.hive参数优化

-- 让可以不走mapreduce任务的,就不走mapreduce任务hive> set hive.fetch.task.conversion=more; // 开启任务并行执行 set hive.exec.parallel=true;// 解释:当一个sql中有多个job时候,且这多个job之间没有依赖,则可以让顺序执行变为并行执行(一般为用到union all的时候)  // 同一个sql允许并行任务的最大线程数 set hive.exec.parallel.thread.number=8; // 设置jvm重用// JVM重用对hive的性能具有非常大的 影响,特别是对于很难避免小文件的场景或者task特别多的场景,这类场景大多数执行时间都很短。jvm的启动过程可能会造成相当大的开销,尤其是执行的job包含有成千上万个task任务的情况。set mapred.job.reuse.jvm.num.tasks=10;  // 合理设置reduce的数目// 方法1:调整每个reduce所接受的数据量大小set hive.exec.reducers.bytes.per.reducer=500000000; (500M)// 方法2:直接设置reduce数量set mapred.reduce.tasks = 20

4.sql优化

(1)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);

(2)union优化

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

(3)count distinct优化

不要使用count (distinct cloumn) ,使用子查询

select count(1) from (select id from tablename group by id) tmp;

(4) 用in 来代替join

如果需要根据一个表的字段来约束另为一个表,尽量用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);

(5)消灭子查询内的 group by 、 COUNT(DISTINCT),MAX,MIN。可以减少job的数量。

(6) join 优化:

Common/shuffle/Reduce JOIN 连接发生的阶段,发生在reduce 阶段, 适用于大表 连接 大表(默认的方式)

Map join :连接发生在map阶段 , 适用于小表 连接 大表
大表的数据从文件中读取
小表的数据存放在内存中(hive中已经自动进行了优化,自动判断小表,然后进行缓存)

set hive.auto.convert.join=true;

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;

5,数据倾斜

表现:任务进度长时间维持在99%(或100%),查看任务监控页面,发现只有少量(1个或几个)reduce子任务未完成。因为其处理的数据量和其他reduce差异过大。

原因:某个reduce的数据输入量远远大于其他reduce数据的输入量

1)、key分布不均匀

2)、业务数据本身的特性(存在热点key)

3)、建表时考虑不周

4)、某些SQL语句本身就有数据倾斜

关键词情形后果
join其中一个表较小,但是key集中分发到某一个或几个Reduce上的数据远高于平均值
join大表与大表,但是分桶的判断字段0值或空值过多这些空值都由一个reduce处理,非常慢
group bygroup by 维度过小,某值的数量过多处理某值的reduce非常耗时
count distinct某特殊值过多处理此特殊值reduce耗时

(1)参数调节

set hive.map.aggr=true  // map端聚合,降低传给reduce的数据量set hive.groupby.skewindata=true // 开启hive内置的数倾优化机制

(2) 熟悉数据的分布,优化sql的逻辑,找出数据倾斜的原因。

如果是在groupby中产生了数据倾斜,是否可以讲groupby的维度变得更细,如果没法变得更细,就可以在原分组key上添加随机数后分组聚合一次,然后对结果去掉随机数后再分组聚合

在join时,有大量为null的join key,则可以将null转成随机值,避免聚集

(3)join的每路输入都比较大,且长尾是热点值导致的,可以对热点值和非热点值分别进行处理,再合并数据

6,合并小文件

小文件的产生有三个地方,map输入,map输出,reduce输出,小文件过多也会影响hive的分析效率:

设置map输入的小文件合并

set mapred.max.split.size=256000000;  //一个节点上split的至少的大小(这个值决定了多个DataNode上的文件是否需要合并)set mapred.min.split.size.per.node=100000000;//一个交换机下split的至少的大小(这个值决定了多个交换机上的文件是否需要合并)  set mapred.min.split.size.per.rack=100000000;//执行Map前进行小文件合并set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

设置map输出和reduce输出进行合并的相关参数:

//设置map端输出进行合并,默认为trueset hive.merge.mapfiles = true//设置reduce端输出进行合并,默认为falseset hive.merge.mapredfiles = true//设置合并文件的大小set hive.merge.size.per.task = 256*1000*1000//当输出文件的平均大小小于该值时,启动一个独立的MapReduce任务进行文件merge。set hive.merge.smallfiles.avgsize=16000000

7,查看sql的执行计划

explain sql

学会查看sql的执行计划,优化业务逻辑 ,减少job的数据量。对调优也非常重要

以上是"Hive怎么调优"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

数据 文件 任务 输出 大小 阶段 处理 输入 多个 热点 过多 查询 参数 场景 数量 方式 格式 篇文章 分组 选择 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 金融科技创新监管互联网金融 互联网金融 科技金融 平安科技 互联网 互联网科技缩写 互联网科技上市公司 有木互联网科技 汉立互联网科技有限公司联系电话 科技与互联网的利与弊 哈尔滨新华互联网科技学院 北京大学互联网科技怎么样 青岛科技大学互联网大赛研究生 速维有品互联网信息科技(苏州)有限公司 长沙互联网科技 智帮互联网科技公司最近动向 电子商务与互联网科技的关系 启辰互联网科技 全球科技与互联网公司市值变化 中国互联网公司的科技投入 科技信息时代互联网发展 科技互联网专业务虚会材料 网络科技有限互联网 以房互联网科技 甘肃拓世互联网科技有限公司 互联网科技教育视频 河南猎农互联网科技有限公司 智腾互联网科技有限公司 众安科技工业互联网合作 互联网科技数字货币 云南互联网科技学费 长沙渺峰互联网科技有限公司
0