hive参数整理

动态分区

set hive.exec.dynamic.partition=true;

set hive.exec.dynamic.partition.mode=nonstrict;

 

设置map个数

1:减少:

set mapred.max.split.size=128000000;
set mapred.min.split.size.per.node=100000000;
set mapred.min.split.size.per.rack=100000000;
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

100000000表示100M

hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;这个参数表示执行前进行小文件合并,

前面三个参数确定合并文件块的大小,大于文件块大小128m的,按照128m来分隔,小于128m,大于100m的,按照100m来分隔,把那些小于100m的(包括小文件和分隔大文件剩下的),进行合并

split:block:maptask (1:1:1)

2:增加:

如果表a只有一个文件,大小为120M,但包含几千万的记录,如果用1个map去完成这个任务,肯定是比较耗时的,这种情况下,我们要考虑将这一个文件合理的拆分成多个,这样就可以用多个map任务去完成。

set mapred.reduce.tasks=10;
create table a_1 as 
select * from a 
distribute by rand(123); 
 这样会将a表的记录,随机的分散到包含10个文件的a_1表中,再用a_1代替上面sql中的a表,则会用10个map任务去完成。
每个map任务处理大于12M(几百万记录)的数据,效率肯定会好很多。

 

设置reduce个数

hive.exec.reducers.bytes.per.reducer(每个reduce任务处理的数据量,默认为1000^3=1G) 
hive.exec.reducers.max(每个任务最大的reduce数,默认为999)
计算reducer数的公式很简单N=min(参数2,总输入数据量/参数1)
即,如果reduce的输入(map的输出)总大小不超过1G,那么只会有一个reduce任务;

 

注:什么情况下只有一个reduce; 
很多时候你会发现任务中不管数据量多大,不管你有没有设置调整reduce个数的参数,任务中一直都只有一个reduce任务;其实只有一个reduce任务的情况,除了数据量小于hive.exec.reducers.bytes.per.reducer参数值的情况外,还有以下原因:
a)    没有group by的汇总,比如把select pt,count(1) from popt_tbaccountcopy_mes where pt = '2012-07-04' group by pt; 写成 select count(1) from popt_tbaccountcopy_mes where pt = '2012-07-04';
这点非常常见,希望大家尽量改写。
b)    用了Order by
c)    有笛卡尔积
通常这些情况下,除了找办法来变通和避免,我暂时没有什么好的办法,因为这些操作都是全局的,所以hadoop不得不用一个reduce去完成。

 

压缩

查看集群的支持的压缩算法

set io.compression.codecs;

Map输出压缩,开启MR中间结果map输出阶段压缩可以减少job中map和Reduce task间数据传输量。

set hive.exec.compress.intermediate=true;--开启hive中间传输数据压缩功能
set mapred.map.output.compression.codec= org.apache.hadoop.io.compress.SnappyCodec

开启MR最终输出Reduce输出压缩

set hive.exec.compress.output=true; --开启hive最终输出数据压缩功能
set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
set mapred.output.compression.type=BLOCK;--设置mapreduce最终数据输出压缩为块压缩,只有SEQUENCEFILE格式需要设置

 

map端聚合

是否开启map的聚合(默认为true)

set hive.map.aggr=true

在 Map 端进行聚合操作的条目数目

set hive.groupby.mapaggr.checkinterval=100000;

发生数据倾斜是,进行负载均衡

set hive.groupby.skewindata=true;

 

mapjoin

set hive.auto.convert.join = true;  --是否开自动mapjoin

set hive.mapjoin.smalltable.filesize;   --mapjoin的表size大小 默认25000000

小表的输入文件大小的阈值(以字节为单位);如果文件大小小于此阈值,它将尝试将公共连接转换为mapjoin。

 
并行执行 

set hive.exec.parallel=true; --打开任务并行执行
set hive.exec.parallel.thread.number=16; --同一个sql允许最大并行度,默认为8。

 

 

 

 
 
posted @ 2023-03-14 09:18  余大乐  阅读(126)  评论(0)    收藏  举报