目标:掌握Hive的常见优化
实施
属性优化
本地模式
hive.exec.mode.local.auto=true;
JVM重用
mapreduce.job.jvm.numtasks=10
推测执行
mapreduce.map.speculative=true
mapreduce.reduce.speculative=true
hive.mapred.reduce.tasks.speculative.execution=true
Fetch抓取
hive.fetch.task.conversion=more
并行执行
hive.exec.parallel=true
hive.exec.parallel.thread.number=16
压缩
hive.exec.compress.intermediate=true
hive.exec.orc.compression.strategy=COMPRESSION
mapreduce.map.output.compress=true
mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.DefaultCodec
矢量化查询
hive.vectorized.execution.enabled = true;
hive.vectorized.execution.reduce.enabled = true;
零拷贝
hive.exec.orc.zerocopy=true;
关联优化
hive.optimize.correlation=true;
CBO优化器
hive.cbo.enable=true;
hive.compute.query.using.stats=true;
hive.stats.fetch.column.stats=true;
hive.stats.fetch.partition.stats=true;
小文件处理
#设置Hive中底层MapReduce读取数据的输入类:将所有文件合并为一个大文件作为输入
hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
#如果hive的程序,只有maptask,将MapTask产生的所有小文件进行合并
hive.merge.mapfiles=true;
hive.merge.mapredfiles=true;
hive.merge.size.per.task=256000000;
hive.merge.smallfiles.avgsize=16000000;
索引优化
hive.optimize.index.filter=true
谓词下推PPD
hive.optimize.ppd=true;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4UGgQtXE-1690355726417)(J:/baidudownload/09-第九阶段spark项目-一站式制造/Day5_数仓事实层DWB层构建/02_随堂笔记/Day5_数仓事实层DWB层构建.assets/image-20210518184328346.png)]
Map Join
hive.auto.convert.join=true
hive.auto.convert.join.noconditionaltask.size=512000000
Bucket Join
hive.optimize.bucketmapjoin = true;
hive.auto.convert.sortmerge.join=true;
hive.optimize.bucketmapjoin.sortedmerge = true;
hive.auto.convert.sortmerge.join.noconditionaltask=true;
Task内存
mapreduce.map.java.opts=-Xmx6000m;
mapreduce.map.memory.mb=6096;
mapreduce.reduce.java.opts=-Xmx6000m;
mapreduce.reduce.memory.mb=6096;
缓冲区大小
mapreduce.task.io.sort.mb=100
Spill阈值
mapreduce.map.sort.spill.percent=0.8
Merge线程
mapreduce.task.io.sort.factor=10
Reduce拉取并行度
mapreduce.reduce.shuffle.parallelcopies=8
mapreduce.reduce.shuffle.read.timeout=180000
SQL优化
设计优化
小结
目标:掌握Hive的常见优化
实施
内存问题:现象程序运行失败
堆内存不足:给Task进程分配更多的内存
mapreduce.map.java.opts=-Xmx6000m;
mapreduce.map.memory.mb=6096;
mapreduce.reduce.java.opts=-Xmx6000m;
mapreduce.reduce.memory.mb=6096;
物理内存不足
虚拟内存不足:调整虚拟内存的比例,默认为2.1
数据倾斜问题:程序运行时间长,一直卡在99%或者100%
现象
基本原因
根本原因:分区的规则
数据倾斜的场景
解决方案
group by / count(distinct)
开启Combiner
hive.map.aggr=true
随机分区
方式一:开启参数
hive.groupby.skewindata=true
方式二:手动指定
distribute by rand():将数据写入随机的分区中
distribute by 1 :将数据都写入一个分区
join
方案一:尽量避免走Reduce Join
方案二:skewjoin:避免数据倾斜的Reduce Join过程
--开启运行过程中skewjoin
set hive.optimize.skewjoin=true;
--如果这个key的出现的次数超过这个范围
set hive.skewjoin.key=100000;
--在编译时判断是否会产生数据倾斜
set hive.optimize.skewjoin.compiletime=true;
--不合并,提升性能
set hive.optimize.union.remove=true;
--如果Hive的底层走的是MapReduce,必须开启这个属性,才能实现不合并
set mapreduce.input.fileinputformat.input.dir.recursive=true;
小结
技术面试:理论为主