2、参数项(基于)

2.1、参数设置

set hive.exec.dynamic.partition=true; -- 设置为true表示开启动态分区功能(默认为false)

set hive.exec.dynamic.partition.mode=nonstrict; -- 允许所有分区都是动态的,(默认为strict,表示必须保证至少有一个分区是静态的)

set hive.exec.max.dynamic.partitions=10000 -- 允许的最大的动态分区的个数。可以手动增加分区。默认1000

set hive.exec.max.dynamic.partitions.pernode=1000 -- 一个 mapreduce job所允许的最大的动态分区的个数。默认是100

set hive.exec.parallel=true; -- 开启并行运算

set hive.exec.parallel.thread.number=12; -- 表示同时运行的job的个数

set hive.optimize.sort.dynamic.partition=true; -- 每个分区只产生一个文件,可以解决动态分区时的OOM(hadoop内存溢出)问题,但会严重降低reduce处理并写入一个分区的速度

set mapreduce.map.memory.mb = 2304; -- Mapper阶段JVM堆内存溢出参数调优 container的内存

set mapreduce.map.java.opts = -Xmx2048m; -- Mapper阶段JVM堆内存溢出参数调优 表示jvm堆内存,注意是mapreduce不是mapred

set mapreduce.reduce.java.opts=-=-Xmx2048m; -- Reducer:(默认参数,表示jvm堆内存)

set mapreduce.reduce.memory.mb=2304; -- Reducer:(container的内存)

注意:因为在yarn container这种模式下,map/reduce task是运行在Container之中的,所以上面提到的mapreduce.map(reduce).memory.mb大小都大于mapreduce.map(reduce).java.opts值的大小。mapreduce.{map|reduce}.java.opts能够通过Xmx设置JVM最大的heap的使用,一般设置为0.75倍的memory.mb,因为需要为java code等预留些空间

set mapred.job.name = jobname; -- 如果脚本中有多个sql语句,那么你设定jobname后,所有的sql生成的job都会有同一个名字

set mapreduce.job.priority=VERY_HIGH; -- Hadoop 设置任务执行的队列以及优先级 优先级默认有5个:low、 very_low、 norman(默认)、 high、 very_high

set hive.support.concurrency=false; -- 关闭并发(关闭锁机制) 遇到锁报错的时候

常用参数:

set odps.sql.hive.compatible=true; -- 兼容hive

set odps.sql.type.system.odps2=true; -- 兼容新数据类型(TINYINT、SMALLINT、 INT、 FLOAT、VARCHAR、TIMESTAMP BINARY)

set odps.ext.oss.orc.native=true;

set odps.sql.decimal.odps2=true; -- 打开Decimal 2.0数据类型

set odps.service.mode=off ; -- 关闭准实时模式,限制脚本运行时间,默认为Off

set odps.sql.unstructured.oss.commit.mode=true; -- MaxCompute使用分片上传功能,以two-phase commit的方式保证数据的一致性,兼容其他数据处理引擎。

小文件合并参数:

set odps.merge.cross.paths=true; --设置跨路径合并(合并每个路径下的小文件)

set odps.merge.smallfile.filesize.threshold = 256; --设置合并文件的小文件大小阀值,文件大小超过该阀值,则不进行合并,单位为M,可以不设,不设时,则使用全局变量odps_g_merge_filesize_threshold,该值默认为32M,设置时必须大于32M。

set odps.merge.maxmerged.filesize.threshold = 256; --设置合并输出文件量的大小,输出文件大于该阀值,则创建新的输出文件,单位为M,可以不设,不设时,则使用全局变odps_g_max_merged_filesize_threshold,该值默认为256M,设置时必须大于256M。

set odps.sql.allow.fullscan=true; --开启全局扫描

set odps.merge.quickmerge.flag=false; --一般sql task比merge task低1到n个版本,sql产生的文件版本更低,直接用quickmerge可能会产生数据不兼容【解决办法】是关掉quickmerge

set odps.stage.reducer.num=1000; --增加reduce并行数

set odps.stage.mapper.split.size=1024; --调整每个Mapper读取数据的大小为1024 MB(默认256),从而控制map个数。

2.2、explain

HIVE提供了EXPLAIN命令来展示一个查询的执行计划,这个执行计划对于我们了解底层原理,hive 调优,排查数据倾斜等很有帮助

使用语法如下:

EXPLAIN [EXTENDED|CBO|AST|DEPENDENCY|AUTHORIZATION|LOCKS|VECTORIZATION|ANALYZE] query

explain 后面可以跟以下可选参数,注意:这几个可选参数不是 hive 每个版本都支持的

EXTENDED:加上 extended 可以输出有关计划的额外信息。这通常是物理信息,例如文件名。这些额外信息对我们用处不大

CBO:输出由Calcite优化器生成的计划。CBO 从 hive 4.0.0 版本开始支持

AST:输出查询的抽象语法树。AST 在hive 2.1.0 版本删除了,存在bug,转储AST可能会导致OOM错误,将在4.0.0版本修复

DEPENDENCY:dependency在EXPLAIN语句中使用会产生有关计划中输入的额外信息。它显示了输入的各种属性

AUTHORIZATION:显示所有的实体需要被授权执行(如果存在)的查询和授权失败

LOCKS:这对于了解系统将获得哪些锁以运行指定的查询很有用。LOCKS 从 hive 3.2.0 开始支持

VECTORIZATION:将详细信息添加到EXPLAIN输出中,以显示为什么未对Map和Reduce进行矢量化。从 Hive 2.3.0 开始支持

ANALYZE:用实际的行数注释计划。从 Hive 2.2.0 开始支持

2.3 hive锁

hive存在两种锁:共享锁Shared(S)、互斥锁Exclusive(X)

只触发S锁允许并发操作;只要一个操作者对表或者分区触发了互斥锁,则该表或者分区不能并发操作