hiveSQL参数调优

作为一个小菜鸟,优化SQL的机会其实不多,但是也知道要多多掌握一些,所以根据同事写的代码中的参数,我整理了一版,希望以后遇到问题可以随时查看。

根据个人经验+查阅相关资料,得出以下内容:

set hive.exec.parallel=true;

控制在同一个sql中的不同的job是否可以同时运行,默认为false。
在资源充足的时候hive.exec.parallel会让那些存在并发job的sql运行得更快,但同时消耗更多的资源

set hive.exec.parallel.thread.number=16;

当hive.exec.parallel为true的时候,同一个sql中可以并行执行的job会并发执行.参数hive.exec.parallel.thread.number就是控制对于同一个sql来说同时可以运行的job的最大值,该参数默认为8.此时最大可以同时运行8个job.比如union操作

set   hive.mapred.mode=nonstrict    

hive的运行模式,分为nonstrict,strict.  strict 为开启严格模式  nostrict 关闭严格模式,默认是nonstrict
所谓Hive的严格模式,就是为了避免用户提交一些恶意SQL,消耗大量资源进而使得运行环境崩溃做出的一些安全性的限制
如果Hive开启严格模式,将会阻止以下三种查询:
a.对分区表查询,where条件中过滤字段没有分区字段;
b.对order by查询,order by的查询不带limit语句
c.笛卡尔积join查询,join查询语句中不带on条件或者where条件;

--hive on tez,tez引擎
set hive.tez.container.size=6144;    
set mapreduce.reduce.java.opts=5120;   

 container 内存溢出,可以使用set hive.tez.container.size; 查看当前容器的内存.tez.container.size,单位是 M,可以调大container 的内存为原来的 2 倍,或者 4 倍。
改 hive.tez.container.size 的值之后,一定要改参数 hive.tez.java.opts,hive.tez.java.opts设置JVM 启动参数,最重要的是 -Xmx 设置JVM 最大堆内存。
注意: -Xmx的值一定小于 hive.tez.container.size 的值,一般为 hive.tez.container.size 值的 0.8 倍。

set hive.groupby.skewindata=true;

在数据倾斜时,开启负载均衡,默认不开启

set tez.queue.name=bdp;

使用专有队列xx(此处假定是bdp),提升任务跑批优先级

set tez.grouping.split-count=-1;

用于控制分组聚合操作中的切分数量。设置为-1表示由Tez自动确定切分的数量,一般默认也是-1,这样可以根据数据量和集群特性自动进行优化。

set tez.grouping.max-size=500000000;
set tez.grouping.min-size=500000000;

这两个参数用来确定Map的数量。分组拆分大小的下限,默认值为 50 MB,分组拆分大小的上限,默认值为 1 GB
减小tez.grouping.max-size会增加Map/Reduce的数量,增加tez.grouping.max-size会减少任务的数量。
减小这两个参数可以改善延迟,增大这两个参数可以提高吞吐量。例如,若要为数据大小 128 MB设置四个映射器任务,可将每个任务的这两个参数设置为 32 MB

set hive.exec.dynamici.partition=true; 

开启动态分区,默认是false

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

开启允许所有分区都是动态的,否则必须要有静态分区才能使用。

set hive.auto.convert.join=false;

开启map join自动转换,一般多用于小表与大表join。默认true
mapJoin的主要意思就是,当链接的两个表是一个比较小的表和一个特别大的表的时候,我们把比较小的table直接放到内存中去,然后再对比较大的表格进行map操作。join就发生在map操作的时候,每当扫描一个大的table中的数据,就要去去查看小表的数据,哪条与之相符,继而进行连接。这里的join并不会涉及reduce操作。map端join的优势就是在于没有shuffle。在本质上mapjoin根本就没有运行MR进程,仅仅是在内存就进行了两个表的联合

set hive.mapjoin.smalltable.filesize =25000000 ;

大表小表判断的阈值,如果表的大小小于该值25Mb,则会被判定为小表,会被加载到内存中运行,将commonjoin转化成mapjoin。一般这个值也就最多几百兆的样子

set hive.auto.convert.join.noconditionaltask=true

是否将多个mapjoin合并为一个

set hive.auto.convert.join.noconditionaltask.size=1000000000;    

多个mapjoin转换为1个时,所有小表的文件大小总和的最大值为1G。
 

▶️set mapred.reduce.tasks=100; --这个参数一般不推荐使用

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值