hive中优化

本文介绍了Hive中的多种优化策略,包括Fetch抓取、本地模式、MapJoin、Map端聚合、分区技术、动态分区、合理设置Map和Reduce数、并行执行、执行计划和使用Tez引擎等,旨在提高Hive查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1Fetch 抓取是指:Hive 中对某些情况的查询可以不必使用 MapReduce 计算

hive.fetch.task.conversion 默认是 more,老版本 hive 默认是 minimal,该属性修改为 more 以后,在全局查找、字段查找、limit 查找等都不走 mapreduce

2)本地模式:设置hive.exec.mode.local.auto 的值为 true

3)开启MapJoinset hive.auto.convert.join = true默认为true

大表小表的阈值设置(默认 25M 一下认为是小表)

set hive.mapjoin.smalltable.filesize=25000000;

4)开启 Map 端聚合参数设置

是否在 Map 端进行聚合,默认为 True :hive.map.aggr = true

Map 端进行聚合操作的条目数目hive.groupby.mapaggr.checkinterval = 100000

有数据倾斜的时候进行负载均衡(默认是 falsehive.groupby.skewindata = true

5)count(Distinct) 去重统计在数据量大的情况下用group by 再用count 替换。

6)迪卡尔积,默认是关闭的。

7)行列过滤

列处理:在SELECT中,只拿需要的列,如果有,尽量使用分区过滤,少用SELECT *。

行处理:在分区剪裁中,当使用外关联时,如果将副表的过滤条件写在Where后面,那么就会先全表关联,之后再过滤。

8)采用分桶技术

分区针对的是数据的存储路径;分桶针对的是数据文件。

创建:clustered by(id) into 4 buckets 分桶字段必须是创建表中的字段

开启分桶设置:set hive.enforce.bucketing=true;

设置reducetask个数:set mapreduce.job.reduces=-1;与分桶数一致

9)采用分区技术

创建:partitioned by (month string) 分区字段不能是创建表中的字段

partitioned by (month string, day string)二级分区

开启动态分区参数设置

1)开启动态分区功能(默认 true,开启) hive.exec.dynamic.partition=true

2)设置为非严格模式(动态分区的模式,默认 strict,表示必须指定至少一个分区为

静态分区,nonstrict 模式表示允许所有的分区字段都可以使用动态分区。)

hive.exec.dynamic.partition.mode=nonstrict

3)在所有执行 MR 的节点上,最大一共可以创建多少个动态分区。

hive.exec.max.dynamic.partitions=1000

4在每个执行 MR 的节点上,最大可以创建多少个动态分区。该参数需要根据实际

的数据来设定。比如:源数据中包含了一年的数据,即 day 字段有 365 个值,那么该参数就 需要设置成大于 365,如果使用默认值 100,则会报错。

hive.exec.max.dynamic.partitions.pernode=100

5)整个 MR Job 中,最大可以创建多少个 HDFS 文件。

hive.exec.max.created.files=100000

6)当有空分区生成时,是否抛出异常。一般不需要设置。

hive.error.on.empty.partition=false

10)合理设置Map

Maptask个数:input的文件总个数,input的文件大小,集群设置的文件块大小。

computeSliteSize(Math.max(minSize,Math.min(maxSize,blocksize)))=blocksize=128M 公式通过调整三个值的大小调整map数。

11)小文件进行合并

在Map执行前合并小文件,减少Map数:CombineHiveInputFormat具有对小文件进行合并的功能(系统默认的格式)。HiveInputFormat没有对小文件合并功能。

12)合理设置Reduce

1)每个 Reduce 处理的数据量默认是 256MB

hive.exec.reducers.bytes.per.reducer=256000000

2)每个任务最大的 reduce 数,默认为 1009

hive.exec.reducers.max=1009

3)计算 reducer 数的公式

N=min(参数 2,总输入数据量/参数 1)

hadoop mapred-default.xml 文件中修改,设置每个 job Reduce 个数

set mapreduce.job.reduces = 15;

13)开启sql并行执行:

set hive.exec.parallel=true; //打开任务并行执行

set hive.exec.parallel.thread.number=16; //同一个 sql 允许最大并行度,

默认为 8

14)开启严格模式:

设置hive.mapred.mode 值为 strict,默认为nonstrict非严格模式。

严格模式下的禁止查询:笛卡尔积、order by 后必须使用limit、分区表查询条件必须包含分区字段来限定分区。

15)JVM重用:

mapred-site.xml 文件中进行配置mapreduce.job.jvm.numtasks=10

16)开启推测执行

Hadoop mapred-site.xml 文件中进行配置

mapreduce.map.speculative=true

mapreduce.reduce.speculative=true

hive 本身也提供了配置项来控制 reduce-side 的推测执行:

hive.mapred.reduce.tasks.speculative.execution=true

17)执行计划(Explain

查看详细执行计划:explain extended select * from emp;

18)常用参数

// 输出合并小文件                             

SET hive.merge.mapfiles = true; -- 默认true,在map-only任务结束时合并小文件

SET hive.merge.mapredfiles = true; -- 默认false,在map-reduce任务结束时合并小文件

SET hive.merge.size.per.task = 268435456; -- 默认256M

SET hive.merge.smallfiles.avgsize = 16777216; -- 当输出文件的平均大小小于该值时,启动一个独立的map-reduce任务进行文件merge

19)使用tez引擎

tez是基于内存进行计算的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值