Hive常见优化点整理
hive动态分区开关
set hive.exec.dynamic.partition.mode=nonstrict;
hive并行执行
set hive.exec.parallel=true;
set hive.exec.parallel.thread.number=16;
hive压缩
set mapreduce.map.output.compress= true 开启mapreduce中map输出压缩功能
set hive.exec.compress.intermediate=true: 开启传输数据压缩功能
set hive.exec.compress.output=true: 开启mapreduce最终输出数据压缩
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec: 设置为Gzip格式压缩
set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec: 设置为SnappyCodec压缩
mapreduce split 分片设置
map小文件过多,导致启动的mapper数过多,占用集群资源,可以设置如下参数,将小文件进行合并,减少mapper的数目,
set mapred.max.split.size=1000; 指定split切片大小1000K,默认128M,
set mapred.min.split.size.per.node=400; 指定每个节点split的大小,超过这个值会进行新的split切分
set mapred.min.split.size.per.rack=200; 指定每个rack split 大小,超过这个值会进行新的split切分
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat
默认为org.apache.hadoop.hive.ql.io.HiveInputFormat
mapreduce输出端配置
set hive.merge.mapfiles = true: 在Map-only的任务结束时合并小文件
set hive.merge.mapredfiles = true: 在Map-Reduce的任务结束时合并小文件
set hive.merge.size.per.task = 256*1000*1000: 合并文件的大小
set hive.merge.smallfiles.avgsize=16000000: 当输出文件的平均大小小于该值时,启动一个独立的map-reduce任务进行文件merge
hive mapreduce reduce个数设置
set hive.exec.reducers.bytes.per.reducer=500000000: 设定一个reduce处理的数据量为500M
set hive.exec.reducers.max = 888: 设置一个MR最大的reduce数,默认为999
set mapred.reduce.tasks = 100 可以强制指定reduce个数
hive 数据倾斜
set hive.groupby.skewindata = true
hive分桶
分桶优点:
1、抽样查询 2、map-side join 两个对相同字段做了同样分桶规则的表关联,可以实现在map端join,提高效率。 3、控制文件数量
1、创建分区分桶表
create table t1(id int) partitioned by (statis_date string) clustered by(id) into 4 buckets;
2、准备数据
set hive.enforce.bucketing=true; // 强制分桶
insert into t1 partition(statis_date='20211101')select * from (
select 1 id union all
select 2 id union all
select 3 id union all
select 4 id union all
select 5 id union all
select 6 id union all
select 7 id union all
select 8 id ) tmp
cluster by id;
select columns from table tablesample(bucket x out of y on column);
-- x:表示从第几个分桶进行抽样
-- y:表示每隔几个分桶取一个分桶,必须为y的整数倍或者因子
3、例如下面从对表从桶1开始查,每次间隔1个桶,得到桶1和桶3的全部数据:
select id,statis_date from t1 tablesample(bucket 1 out of 2 on id);