0%

配置调优

配置调优

map join配置

对于两个表的join操作,将小表写在join的左边,大表写在join的右边,小表驱动大表来进行查询,可以使用mapjoin使得小表进入内存,将小表文件加载到DistributeCache中,再扫描大表,根据DistributeCache中的数据与大表进行关联对应

1
2
3
4
-- 设置自动选择mapjoin(默认是true)
set hive.auto.convert.join=true;
-- 设置大小表阈值(默认25M)
set hive.mapjoin.smalltable.filesize=25000000;

group by 配置

默认情况下,Map阶段同一个key的数据分发给一个reduce,如果一个key数据过大就会导致数据倾斜,可以在Map阶段进行聚合操作

1
2
3
4
5
6
-- 配置是否在Map阶段进行聚合,默认true
set hive.map.aggr=true;
-- 在Map阶段进行聚合操作的数据条数,默认100000
set hive.groupby.mapaggr.checkinterval=100000;
-- 数据倾斜时是否进行负载均衡,默认false
set hive.groupby.skewindata=true;

小文件合并

当小文件过多时会导致map的数量增多,可以进行小文件的合并来减少map数

1
2
3
4
5
6
7
8
9
10
-- CombineHiveInputFormat可以合并小文件(默认CombineHiveInputFormat)
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
-- 在map-only任务结束时合并小文件,默认true
set hive.merge.mapfiles=true;
-- 在map-reduce任务结束时合并小文件,默认false
set hive.merge.mapredfiles=true;
-- 合并文件的大小,默认256M
set hive.merge.size.per.task=256000000;
-- 当输出文件的平均大小小于该值时,启动一个独立的map-reduce任务进行文件merge
set hive.merge.smallfiles.avgsize=16000000;

Reduce数量配置

reduce的数量要适量的设置,启动和初始化reduce也是相当耗时的,而且reduce过多会导致输出过多的小文件

1
2
3
4
-- 每个reduce处理的数据量默认为256M
set hive.exec.reducers.bytes.per.reducer=256000000
-- 每个任务最大的reduce数(默认1009)
set hive.exec.reducers.max=1009;

并发执行

hive会将一个查询sql转换为一个或多个阶段,包含MapReduce阶段、抽样阶段、合并阶段、limit阶段等。默认情况下,hive一次只会执行一个阶段,但是这些阶段可能并不是相互依赖的,可以并发执行

1
2
3
4
-- 打开并发执行(默认false)
set hive.exec.parallel=true;
-- 同一个sql允许最大并行度,默认为8
set hive.exec.parallel.thread.number=8;

注意:在集群中,如果job的并发很多,会导致集群利用率增加

严格模式

为了防止一些不合法的sql无法执行,可以配置严格模式

1
2
3
4
5
6
-- 分区表如果不使用分区字段来过滤则不允许执行(默认false)
set hive.strict.checks.no.partition.filter=true;
-- 如果使用order by语句,没有使用limit则不允许执行(默认false)
set hive.strict.checks.orderby.no.limit=true;
-- 限制笛卡尔积的查询,即使用join时没有on进行关联(默认false)
set hive.strict.checks.cartesian.product=true;