一、hive优化
要针对hive优化,首先要明白hive的本质和运行慢的原因
hive 的本质是:hdfs+MapReduce
hive 运行速度慢的原因大致有如下几个:
1、数据倾斜倾斜:抽样
1.1、内容倾斜
1.2、group by
1.3、小表 join 大表
2、连接操作过多
2.1、join过多导致job过多
2.2、小文件过多
2.3、Mapper或Reducer过多
3、使用不当
3.1、count(distinct)
3.2、join ... on ... where
3.3、select sum(field) from TABLE;
首要最好从源头,hive的模型设计上考虑。整体最优,考虑全局的情况下,合理减少表数量。数据建模上推荐使用【星型】,雪花,星座不宜使用。
使用维度表存放静态数据,事实表(动态数据:4W1H)
维度退化 => 星型
sqoop|maxwell|cancal : query "select ... join ..."
ods -> dwd insert into ... select ... join ...
充分了解业务,提前设计好预聚合
分层=>轻量聚合
分区=>避免交换
on... where...
分桶=>拉链表(分桶表)、抽样
压缩=>减少体量
配置压缩格式,表存储格式,查看是否支持压缩,是否支持切片。
hadoop 内存管理
# mapred
set mapreduce.map.memory.mb=256;
set mapreduce.reduce.memory.mb=512;
set mapreduce.map.java.opts=?
set mapreduce.reduce.java.opts=?
# yarn
set yarn.nodemanager.resource.memory-mb=-1;
set yarn.scheduler.minimum-allocation-mb=1024;
set yarn.scheduler.maximum-allocation-mb=8192;
数据倾斜(内置自动优化) 可能触发的原因: 连接字段在连接表之间分布不均,或缺乏连接关系 【连接键】的值分布不均:值集中的少数分区,其他分区没有值 某张表中数据分布不均 手动处理方案: 1、手动选择合适的连接键 2、连接键拆分或随机映射 3、引入hash分区或分桶使得数据分布均衡 4、增加或减少任务的并行度 hive自动处理配置项
默认false,如果join键倾斜则设为true
set hive.optimize.skewjoin=true;
# 默认join键对应的记录数超过该值则进行倾斜分析
set hive.skewjoin.key=100000;
# 默认10000,设置倾斜处理mapper数量,过大会导致过多的任务切割和额外的开销,过小会导致不能优化
set hive.skewjoin.mapjoin.map.tasks=10000;
# 默认32M,倾斜最小切片大小,配合上一项使用,避免Mapper数量过多
set hive.skewjoin.mapjoin.min.split=32M;
# map join: 大小表
# 默认true,即默认自动开启 mapjoin
set hive.auto.convert.join=true;
# 默认小表<=25M
set hive.mapjoin.smalltable.filesize=25M;
# 默认false,分桶表表mapjoin专用
set hive.optimize.bucketmapjoin=true;
# combiner: #默认true,即默认开启Mapper端聚合
set hive.map.aggr=true;
# groupby:HashPartitioner
# 默认-1,倾斜的倍数(倾斜度) n = 倾斜数据总均量/其他数据总均量 + 其他数据的差异数
# 抽样(tablesample(bucket COUNT outof TOTAL))确定是偶倾斜与倾斜程度
set mapreduce.job.reduces=n; (见下面 Reducer 数量控制)
# 默认false
set hive.groupby.skewindata=true;
Map或Reduce输出过多小文件合并
# 若满足以下设置条件,任务结束后会单起MapReduce对输出文件进行合并
# 默认为true,map-only输出是否合并
set hive.merge.mapfiles=true;
# 默认为false,mapreduce输出是否合并
set hive.merge.mapredfiles=true;
# 默认256M,合并文件操作阈值,如果输入数据超过256M,则触发合并操作
set hive.merge.size.per.task=256M;
# 默认16M,合并文件平均大小小于该阈值则将他们合并为大文件
set hive.merge.smallfiles.avgsize=16M;
控制Ma

最低0.47元/天 解锁文章
9442

被折叠的 条评论
为什么被折叠?



