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),这时就可以让它们并行,充分利用集群资源。‌‌

关键参数

  1. ‌开启开关‌:hive.exec.parallel,默认 false,设为 true 即可开启。
  2. ‌控制并行度‌: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 任务数、合并小文件等参数,效果会更明显。‌‌

 9)严格模式

Hive严格模式是调优时用来‌拦截高风险查询‌的安全开关,核心目的就是防止你写出扫描全表、单Reducer跑很久这类“意外爆炸”的SQL。开启后,主要有三类查询会被直接禁止执行。‌‌

‌如何开启‌:通过设置参数 hive.mapred.mode=strict 开启,默认值是 nonstrict(非严格)。‌‌

🚫 严格模式禁止的3类查询

  1. ‌分区表必须带分区过滤‌:查询分区表时,WHERE 里必须包含分区字段的过滤条件,不允许扫描所有分区。因为分区表数据量通常巨大,全扫描会消耗难以接受的资源。
  2. ORDER BY 必须配 LIMIT‌:ORDER BY 是全局排序,会把所有数据拉到一个Reducer里处理。强制加 LIMIT 是为了避免Reducer运行时间过长。
  3. ‌禁止笛卡尔积‌:两张表JOIN时必须写 ON 条件,不允许只用 WHERE 关联。Hive不会像关系型数据库那样自动优化,表大时会产生不可控的结果集。‌‌

✅ 严格模式的实战价值

严格模式本质是‌成本保护机制‌,强制你在写SQL时就考虑资源消耗。日常开发建议开启,能提前发现三类低级错误,避免任务跑到一半资源耗尽或超时。 但特殊场景下,如果确实需要全分区扫描,可以临时关闭(set hive.mapred.mode=nonstrict)再执行,用完记得改回来。‌‌

另外,严格模式只拦截上面三类“硬伤”。像数据倾斜、小文件过多、COUNT(DISTINCT) 导致OOM这类问题,它管不了,还需要配合其他调优手段。‌‌

10)JVM重用

11)推测执行

 

 

 

【注】数据量大的使用mr引擎,数据量小,要求计算快的使用tez引擎,基于内存的计算。

 

posted @ 2020-03-25 14:18  hulifang  阅读(202)  评论(0)    收藏  举报