Hive - 常用调优-生产调优-数据倾斜-小文件-压缩

本文简介,参数涉及mapjoin,小文件合并,map/reduce大小控制,动态分区设置,压缩,数据倾斜,内存设置等

部分参数可按所在环境酌情调整

-- hive参数设置 by摸鱼

set io.compression.codecs; --查看当前hive支持的压缩版本
--io.compression.codecs=org.apache.hadoop.io.compress.DefaultCodec,org.hadoop.io.compress.GzipCodec,.....

set hive.execution.engine=mr;
set mapreduce.job.queuename=root.hive_quenename;
set mapreduce.job.name=hive_job_name;
-- 动态分区
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict; --在strict模式下,用户必须指定至少一个静态分区的情况下,用户不小心覆盖所有分区,在nonstrict模式的所有分区都被允许是动态的
set hive.exec.max.dynamic.partitions.pernode=10000; --每个map/reduce节点允许创建的最大动态分区数
set hive.exec.max.dynamic.partitions=10000; --总共允许创建的最大动态分区数
set hive.exec.max.created.files=100000; -- mapreduce作业中所有映射器(map)/还原器(reduce)创建的最大的hdfs的最大数量
set hive.error.on.empty.partition=false; -- 动态分区插入产生空结果是否抛出异常
--开启job并行执行
set hive.exec.parallel=true; -- 开启并行,默认false
set hive.exec.parallel.thread.number=10;
-- 控制map个数
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; -- 执行map前进行小文件合并
set mapred.max.split.size=256000000; #每个Map最大输入大小
set mapred.min.split.size.per.node=100*1000*1000; # 控制最小split,优先级低 # 节点 # 一个节点上split的至少的大小 
set mapred.min.split.size.per.rack=128*1000*1000; # 控制最小split,优先级低 # 机架 # 一个交换机下split的至少的大小
-- 设置reduce个数
set mapred.reduce.tasks = 150; -- 直接设置reduce个数,暴力设置,不推荐
set mapred.max.split.size=512000000; -- 同map
set mapred.min.split.size.per.node=100*1000*1000; -- 同map
set mapred.min.split.size.per.rack=128*1000*1000; -- 同map
set hive.exec.reducers.bytes.per.reducer=1024*1000*1000; -- 每个reduce的大小
-- 小文件合并
set hive.merge.mapfiles=true; -- 是否在纯Map的任务(map-only job没有reduce task)后开启小文件合并
set hive.merge.mapredfiles=true; -- 是否在mapreduce任务后开启小文件合并
set hive.merge.sparkfiles=true; -- 是否在hive on spark任务后开启小文件合并
set hive.merge.smallfiles.avgsize=32*1000*1000; -- 如果原先输出的文件平均大小小于这个值,则开启小文件合并
set hive.merge.size.per.task=256000000; -- 开启小文件合并后,预期的一个合并文件大小。默认256M
-- MapJoin
set hive.auto.convert.join=true; -- 设置自动选择MapJoin,默认是true
set hive.mapjoin.smalltable.filesize=25000000; -- 默认25M
set hive.auto.convert.join.noconditionaltask=true; -- map-side join
set hive.auto.convert.join.noconditionaltask.size=10000000; -- 多大的表可以自动触发放到内层LocalTask中,默认大小10M
-- 开启中间压缩
set hive.exec.compress.intermediate=true; -- 开启中间压缩,默认是false
set mapred.map.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
-- 开启hive输出压缩
set hive.exec.compress.output=true;
set mapred.output.compression.codec=org.hadoop.io.compress.GzipCodec;
-- 数据倾斜
set hive.map.aggr=true; -- 开启map端聚合
set hive.groupby.skewindata=true;
set hive.optimize.groupby=true; -- 在做分区和表查询时是否做分桶group by,默认开启true;
set hive.optimize.countdistinct=true; -- 对count(distinct)优化, 即使真的出现数据倾斜也可以自动优化,自动改变SQL执行的逻辑
set hive.optimize.skewjoin=true; -- 大表和大表进行join则可使用skewjoin,对倾斜数据开启mapjion,对非倾斜数据开启普通join,默认false
------- skewjoin --------
-- 大表和大表进行join则可使用skewjoin
-- 对于skewjoin.key,在执行join时,将他们存入临时的HDFS目录。其他数据正常执行
-- 对倾斜数据开启map join操作,对非倾斜值采取普通操作
-- 将倾斜数据集和非倾斜数据集进行合并操作
-------------------------
set hive.skewjoin.key=100000; -- 倾斜数据超过100000条,启用skewjoin
set hive.skewjoin.mapjoin.map.tasks=10000; -- 指定倾斜连接中,用于Map连接作业的任务数
set hive.skewjoin.mapjoin.min.split=33554432; -- 通过指定最小split的大小,执行细粒度的控制
-- 如果建表时指定了倾斜key,可以使用set hive.optimize.skewjoin.compiletime=true;开启skew join
-- 如果通过如下建表语句指定skewed key;
-- CREATE TABLE list_bucket_single (key STRING, value STRING)
-- SKEWED BY (key) ON (1,5,6) [STORED AS DIRECTORIES];
set hive.optimize.skewjoin.compiletime=true;
-- mapreduce内存参数设置
set mapreduce.map.cpu.vcores=2; -- 每个Maptask可用的最多cpu core数目,默认值:1
set mapreduce.reduce.cpu.vcores=2; -- 每个Reducetask可用最多cpu core数目默认值:1
set mapreduce.map.memory.mb=8192; -- 
set mapreduce.reduce.memory.mb=8192; --
set mapreduce.map.java.opts=-Xmx6144m;
set mapreduce.reduce.java.opts=-Xmx6144m;
set mapreduce.task.io.sort.mb=256; -- shuffle 的环形缓冲区大小,默认256m
set mapreduce.map.sort.spill.percent=0.9; -- 环形缓冲区溢出的阈值,默认 80%

以上

猜你喜欢

转载自blog.csdn.net/qq_24256877/article/details/121411912