赞
踩
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;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。