hive优化点
1)map join(默认是开启的)
MapJoin是hive的一种优化操作,其适用于小表join大表的场景,由于表的操作是在Map端且在内存进行的,所以其不需要启动reduce任务也就不需要经过shuffle阶段,从而能在一定程度上节省资源提高Join效率。
2)分区,分桶
3)合理设置map个数,合理设置reduce个数
4)优化小文件(合并小文件)
在Map执行前合并小文件,减少Map数:CombineHiveInputFormat具有对小文件进行合并的功能
Map输入合并小文件
对应参数:
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; #执行Map前进行小文件合并
set mapred.max.split.size=256000000; #每个Map最大输入大小
set mapred.min.split.size.per.node=100000000; #一个节点上split的至少的大小
set mapred.min.split.size.per.rack=100000000; #一个交换机下split的至少的大小
5)常用参数
输出合并小文件
set hive.merge.mapfiles = true 默认true,在map-only任务结束时合并小文件
set hive.merge.mapredfiles = true 默认false,在map-reduce任务结束时合并小文件
set hive.merge.size.per.task = 256*1000*1000 #合并文件的大小
set hive.merge.smallfiles.avgsize=16000000当输出文件的平均大小小于该值时,启动一个独立的map-reduce任务进行文件merge
7)行列过滤
8)并行执行
Hive 的并行执行,核心就是让一个 SQL 里互相没有依赖关系的多个阶段(Stage)同时跑,而不是排队一个个来,从而缩短整体执行时间。
核心原理
Hive 会把一条 SQL 拆成多个阶段(比如 MapReduce 任务、抽样、合并等)。默认情况下这些阶段是串行执行的,但很多阶段之间并没有数据依赖(比如多个独立的子查询最后再 UNION),这时就可以让它们并行,充分利用集群资源。
关键参数
- 开启开关:
hive.exec.parallel,默认false,设为true即可开启。 - 控制并行度:
hive.exec.parallel.thread.number,默认8,表示同一个 SQL 里最多允许多少个 Job 同时跑。可以按需调大,比如16
配置示例:
SET hive.exec.parallel=true; SET hive.exec.parallel.thread.number=16;适用场景
- 典型的场景是多个独立的子查询,比如分别统计不同维度指标,最后再 UNION 到一起,这几个子查询就可以并行跑。
- 一条 SQL 里有多个
LEFT JOIN,彼此之间没有依赖关系时,也能并行加速。
注意事项
⚠️ 并行执行会显著增加集群资源消耗。如果集群资源本身紧张,强行并行反而可能导致任务排队、资源竞争,性能不升反降。
✅ 建议在资源相对空闲时开启,并且先在测试环境验证效果,再上生产。同时可以配合调整 Map/Reduce 任务数、合并小文件等参数,效果会更明显。
Hive严格模式是调优时用来拦截高风险查询的安全开关,核心目的就是防止你写出扫描全表、单Reducer跑很久这类“意外爆炸”的SQL。开启后,主要有三类查询会被直接禁止执行。
如何开启:通过设置参数 hive.mapred.mode=strict 开启,默认值是 nonstrict(非严格)。
🚫 严格模式禁止的3类查询
- 分区表必须带分区过滤:查询分区表时,
WHERE里必须包含分区字段的过滤条件,不允许扫描所有分区。因为分区表数据量通常巨大,全扫描会消耗难以接受的资源。 -
ORDER BY必须配LIMIT:ORDER BY是全局排序,会把所有数据拉到一个Reducer里处理。强制加LIMIT是为了避免Reducer运行时间过长。 - 禁止笛卡尔积:两张表
JOIN时必须写ON条件,不允许只用WHERE关联。Hive不会像关系型数据库那样自动优化,表大时会产生不可控的结果集。
✅ 严格模式的实战价值
严格模式本质是成本保护机制,强制你在写SQL时就考虑资源消耗。日常开发建议开启,能提前发现三类低级错误,避免任务跑到一半资源耗尽或超时。 但特殊场景下,如果确实需要全分区扫描,可以临时关闭(set hive.mapred.mode=nonstrict)再执行,用完记得改回来。
另外,严格模式只拦截上面三类“硬伤”。像数据倾斜、小文件过多、COUNT(DISTINCT) 导致OOM这类问题,它管不了,还需要配合其他调优手段。
10)JVM重用
11)推测执行
【注】数据量大的使用mr引擎,数据量小,要求计算快的使用tez引擎,基于内存的计算。

浙公网安备 33010602011771号