hive 常用参数、参数优化

1、队列设置

首先要确定使用的计算引擎是哪个,hive默认使用的是 mr

可以是以下两类:mr 和 tez
set hive.execution.engine=mr;
set hive.execution.engine=tez;

1.1 如果使用的是默认mr,设置队列:

方法1:hive cli 登录后使用
set  mapreduce.job.queuename=queue_name;(新版本)


方法2:hive cli 登录时使用
hive --hiveconf mapreduce.job.queuename=queue_name;
hive --hiveconf mapreduce.job.queuename=xxx

以上两个方法都是针对当前会话有效


方法3:修改hive-site.xml文件


1.2 如果使用的是 tez:
set tez.queue.name=queue_name;
queue_name :是要设置的队列的名称;

hive默认使用的是mr
set hive.execution.engine=tez;
set mapreduce.job.queuename=root.default;

设置队列,tez引擎,Tez引擎是纯内存操作
set hive.execution.engine=tez;
set tez.queue.name=root.default;


2、解决OOM的参数
set tez.am.task.max.failed.attempts=10;
set tez.am.max.app.attempts=5;
set hive.tez.java.opts=-Xmx6144m;
配置Map任务的Java参数,如果任务处理的数据量过大,可以适当调节该参数,避免OOM(内存溢出)
set hive.tez.container.size=8192;


3、开启动态分区参数:
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.dynamic.partitions.pernode=1000;
set hive.exec.dynamic.partition=true; --默认:false
set hive.exec.dynamic.partition.mode = nonstrict; --默认:strict
set hive.exec.dynamic.partitions=10000; --分区最大数:如果按天分区的话设置10000足够了

4、使用场景:使用正则表达式来筛选字段
set hive.support.quoted.identifiers=none;
--反引号不在解释为其他含义,被解释为正则表达式
set hive.support.quoted.identifiers = none;

示例1:过滤掉不需要的列名(字段要用小括号包裹)
select `(id|name)?+.+` from user_info;

示例2:模糊匹配有相似性的列名
select `.+score` from user_info;


5、hive锁机制
set hive.support.concurrency=false;
set hive.support.concurrency=false;
在 session 中关闭锁,这个参数为 false 既能保证session忽略任何锁强行操作数据,又能保证session里的SQL对表不加任何锁。

hive 目前主要有两种锁,SHARED(共享锁 S)和 Exclusive(排他锁 X)。其中只触发S锁的操作可以并发执行,只要有一个操作对表或者分区触发了X锁,则该表或者分区不能并发的执行作业。

总结起来就是:
1、查询操作使用共享锁,共享锁是可以多重、并发使用的多个查询同时访问一个表是可以的,同时使用共享锁

2、修改表操作使用独占锁,它会阻止其他的查询、修改操作
当修改表的时候,使用独占锁,所以此时没办法执行查询

3、可以对分区使用锁
对一个分区上锁,不影响其他分区使用

参考链接:hive锁机制

https://blog.csdn.net/Samooyou/article/details/125005500


6、开启向量执行模式
开启hive.vectorized.execution.enabled操作,默认是关闭状态,将一个普通的查询转化为向量化查询执行是一个Hive 特性。
它大大减少了扫描、过滤器、聚合和连接等典型查询操作的CPU 使用。
标准查询执行,系统一次处理一行。矢量化查询执行,可以一次性处理1024行的数据块,以减少底层操作系统处理数据时的指令和上下文切换

set hive.vectorized.execution.enabled=false;
set hive.vectorized.execution.enabled = true;
开启向量模式,默认值是false
相当于从原本的map逐行处理数据变成了批量处理数据,从处理一行到一次性处理多行,减少了cpu指令和cpu上下文切换.
可以提高效率;tez和spark引擎支持map和reduce端的向量模式
set hive.vectorized.execution.reduce.enabled=false;
表示是否启用reduce任务的向量化执行模式,默认值是true,但是mapreduce引擎并不支持,需要更换引擎才可以使用这个参数
set hive.vectorized.execution.reduce.groupby.enabled=false;

7、hive.cbo.enable
在 Hive 1.1.0 之后,这个 feature 是默认开启的,它可以自动优化 HQL中多个 Join 的顺序,并选择合适的 Join 算法。
set hive.cbo.enable=false;

CBO优化参考链接

https://blog.csdn.net/weixin_42921390/article/details/115289586

8、其他参数
set tez.am.java.opts=-Xmx6144m;
set tez.am.resource.memory.mb=4096;
#设置 tez AM 容器内存,默认值:1024;建议:不小于或者等于yarn.scheduler.minimum-allocation-mb值。
配置文件:tez-site.xml

set tez.runtime.shuffle.fetch.buffer.percent=0.10;
set tez.runtime.shuffle.memory.limit.percent=0.10;

set tez.runtime.io.sort.mb=2048;
tez.runtime.io.sort.mb:设置输出排序内存大小,默认100,建议:40%*hive.tez.container.size,一般不超过2G。

set mapred.map.tasks.speculative.execution=true;
set mapred.reduce.tasks.speculative.execution=true;

9、Hive并发执行

set hive.exec.parallel=true;
hive.exec.parallel参数,控制在同一个sql中的不同的job是否可以同时运行,默认为 false.
hive.exec.parallel:Hive并发执行,true表示并发,即开启作业并行。
若为true一个sql语句中分解的多个job没有顺序关系时会并发执行,有顺序关系时会按顺序执行,资源充足时建议开启。默认false。
set hive.exec.parallel.thread.number=64;
Hive.exec.parallel.thread.num:默认8,最多并行的作业数量,即1个sql最多允许8个mr或tez作业并行。

10、合并小文件
set hive.merge.mapfiles=true; --在Map-only的任务结束时合并小文件
set hive.merge.mapredfiles=true; --在Map-Reduce的任务结束时合并小文件

Hive合并小文件参数总结
http://ttps://blog.csdn.net/qq_43688472/article/details/103494484

11、待完善,补充
-- 启动Map Join自动转换
set hive.auto.convert.join=true;
set hive.auto.convert.join=false;


set hive.groupby.skewindata=true;


set hive.stats.fetch.column.stats=false;
set hive.map.aggr=false;

set mapreduce.map.memory.mb=8192;
set mapreduce.reduce.shuffle.memory.limit.percent=0.10;
set mapreduce.reduce.shuffle.input.buffer.percent=0.6;

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值