irpas技术客

hive参数调优_Jasoncbk_hive vectorized

网络 7478

1 思路 1.1 查看explain,使用spark引擎的执行计划) 1.2 查看yarn日志 1.3 向量化查询

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

1.4 开启并行执行 set hive.exec.parallel=true; set hive.exec.parallel.thread.number=2; select s_age, max(s_birth) stat, 'max' tp from student_tb_orc group by s_age union all select s_age, min(s_birth) stat, 'min' tp from student_tb_orc group by s_age;

串行执行 变为并行执行,即原来的1→2→3,变为(1,2)→3,其 中, 1、2同时计算。

1.5 yarn资源配置

● yarn.scheduler.minimum-allocation-mb:默认值1024MB,是每个容器 请求被分配的最小内存。如果容器请求的内存资源小于该值,会以1024MB 进 行分配;如果NodeManager可被分配的内存小于该值,则该NodeManager 将会被ResouceManager给关闭。 ● yarn.scheduler.maximum-allocation-mb:默认值8096MB,是每个容器 请 求被 分 配的 最大内 存。如 果容器 请求的 资源超过 该值, 程序会 抛出 InvalidResourceRequest Exception的异常。 ● yarn.scheduler.minimum-allocation-vcores:默认值1,是每个容器请求 被分配的最少虚拟CPU 个数,低于此值的请求将被设置为此属性的值。此外, 配置为虚拟内核少于此值的NodeManager将被ResouceManager关闭。 ● yarn.scheduler.maximum-allocation-vcores:默认值4,是每个容器请求 被 分 配 的 最 少 虚 拟 CPU个 数 , 高 于 此 值 的 请 求 将 抛 出 InvalidResourceRequestException的异常。如果开发者所提交的作业需要处 理的数据量较大,需要关注上面配置项的配置。 YARN还能对容器使用的硬件资源进行控制,通过如下的配置: ●yarn.nodemanager.resource.percentage-physical-cpu-limit: 默 认 值100。一个节点内所有容器所能使用的物理CPU的占比,默认为100%。即如 果一台机器有16核,CPU的使用率最大为1600%,且该比值为100%,则所有 容器最多能使用的CPU资源为1600%,如果该比值为50%,则所有容器能使用 的CPU资源为800%。 ● yarn.nodemanager.linux-container-executor.cgroups.strict-resource usage:默认值为false,表示开启CPU的共享模式。共享模式告诉系统容器除 了能够使用被分配的CPU资源外,还能使用空闲的CPU资源。

2 map端 2.1 hive中mapper阶段相关配置

set hive.vectorized.execution.enabled = true; 开启向量模式,默认值是false 相当于从原本的map逐行处理数据变成了批量处理数据,从处理一行到一次性处理多行,减少了cpu指令和cpu上下文切换. 可以提高效率 tez和spark引擎支持map和reduce端的向量模式

2.2 hive中mapper阶段相关配置

set hive.vectorized.execution.enabled = true; 开启向量模式,默认值是false 相当于从原本的map逐行处理数据变成了批量处理数据,从处理一行到一次性处理多行,减少了cpu指令和cpu上下文切换. 可以提高效率 tez和spark引擎支持map和reduce端的向量模式

MapJoin自动优化,默认开启

2.3 大小表join时开启MapJoin端优化

hive.smalltable.filesize or hive.mapjoin.smalltable.filesize: 默认值是25m 如果大小表连接时小表数据小于该值,则自动开启mapjoin优化 新版本hive该参数变为 hive.auto.convert.join.noconditionaltask.size :默认值10m 和 hive.auto.convert.join.noconditionaltask: 默认值是true 两个配合参数使用 表示hive会把输入文件的大小小于10m的表连接操作自动转化为mapjoin操作

默认开启map端聚合

2.4 hive.map.aggr.hash.precentmemory

默认值是0.5 该配置含义是,如果开启map端聚合,聚合所用的数据结构式hash表,那么还会占用到整个map分配的内存50%

2.5 hive.mapjoin.optimized.hashtable

默认值是true 该配置只能用于tez或者spark引擎 因为使用一种内存优化hash表做mapjoin,该类型的hash表无法被序列化到磁盘

2.6 Hive.mapjoin.optimized.hashtable.websize

默认值是10m 优化的hash表使用的一种链块的内存缓存,该值表示一个块的内存缓存大小,该结构相对较大的表能够加快块数据加载,但是对于数据量较小的表,将会分配多余的内存

2.7 hive.map.groupby.sorted

2.0以前是默认false 2.0以后是true,对于分桶或者排序表,分组聚合的键(列)和分桶或者排序的列一直,将会使用buckeditzedHiveInputFormat

2.8 hive.vectorized.execution.mapjoin.native.enabled

是否使用源生的向量化在执行模式mapjoin,他会比普通的mapjoin速度快,默认值是false


通常来说要开启 set hive.map.aggr =true 加上这个配置,会在map端输出到reduce前,进行一次聚合也就是groupby,可以通过explain,这样做减少了map端输出,减少了下游任务的shuffle数据量,减少了磁盘io,这个参数hive这总是默认开启,但是需要配合另外两个参数联调使用. 分别是: hive.map.aggr.hash.min.reducetion和hive.groupby.mapaggr.checkinterval用于控制何时启用聚合 hive.map.aggr.hash.min.reducetion 是一个阈值: 默认值是0.5 hive.groupby.mapaggr.checkinterval 默认值是100000,hive在启用combiner时会尝试取这个配置对应的数据量进行聚合,将聚合后的数据除以聚合前的数据如果小于hive.map.aggr.hash.min.reducetion 这关闭此功能,反之亦然

hive.map.aggr.hash.force.flush.memory.threshold 默认值是0.9,如果在聚合时,所占用hash表内存超过0.9,则触发刷写磁盘操作

hive.map.aggr.hash.percentmemory 默认值是0.5 在mapper端聚合运行占用的最大内存 比如该节点分配的最大堆内存是1024M,那么map端聚合时hash表内存最大占用是512m,可以适当调节


3 reduce端 3.1 mapred.reduce.tasks

设置reduce的数量,可以由此参数进行指定

3.2 hive.exec.reducers.bytes.per.reducer

设定每个reducer能够处理的数据量,默认值是256m 如果配置此参数是默认256,如果reduce输入是1g,那么就会有4个reducer

3.3 hive.exec.reducer.max

设置一个作业运行的最大reducer个数,默认值是999

3.4 hive.multigroupby.singereducer

表示如果一个sql语句,有多个分组聚合操作,且分组是使用相同的字段,那么多组聚合操作可以用一个作业的reducer来完成,而不是拆分成多个作业,多个reduce完成,减少重复读取,和shuffle操作

3.5 hive.mapred.reduce.tasks.speculative.execution

开启推测reduce任务推测在执行,系统在一个reduce任务中执行进度远低于其他任务的执行进度,会尝试正在另外的机器上启动一个相同的reduce任务

3.6 hive.optimize.reducededuplication

表示当数据需要按照相同的键再次聚合时,开启这个配置,可以减少重复的聚合操作

3.7 hive.vectorized.execution.reduce.enabled

表示是否启用reduce任务的向量化执行模式,默认值是true,但是mapreduce引擎并不支持,需要更换引擎才可以使用这个参数

4 mapreduce整体的job控制

Hive.optimize.countdistinct 默认是true,3.0新配置 去重并计数的作业会分成两个作业来处理这类sql,已达到减缓sql数据倾斜

Hive.exec.parallel 默认值是flase,是否开启作业的并行,默认情况下,如果一个sql被拆分成两个阶段,并且没有直接依赖,会同时执行两个阶段,资源充足可以开启

Hive.exec.parallel.thread.num 默认值是8,一个作业最多允许8个作业同时执行

Hive.exec.mode.loacl.auto 本地模式,默认是false,不走mapreduce,本地运行,数据量较少可以用

Hive.exec.mode.local.inputbytes.max 默认值128m,如果数据小于该值,则本地运行

Hive.optimize.correlation 默认值是false 相关性优化,打开此配置减少重复的shuffle草祖宗 SELECT t1.key, sum(value) FROM t1 JOIN t2 ON (t1.key = t2.key) GROUP BY t1.key 比如这个sql 存在join和groupby,当join后输出结果是groupby的输入,数据已经按照t1.key分区,因此groupby没有必要为t1.key重新shuffle

5 hive中的tez与LLAP相关的配置

LLAP 可提高25倍的查询性能, LLAP将计算带入内存(而不是计算到磁盘),它智能地缓存内存,并在所有客户端之间共享这些数据,同时保留在群集内弹性缩放的能力

前提是集群的内存资源足够用,因为已经是离线任务,尽可能的减少代价是最理性的,以下配置均需要占用内存,所以视情况而定

tez.am.resource.memory.mb: 配置集群中每个Tez作业的ApplicationMaster所能占用的内存大小

tez.grouping.max-size、tez.grouping.min-size: 配置集群中每个Map任务分组分片最大数据量和最小数据量

hive.tez.java.opts: 配置Map任务的Java参数,如果任务处理的数据量过 大,可以适当调节该参数,避免OOM(内存溢出).选择合理的垃圾回收器,提升每个任务运行的吞吐量。

hive.convert.join.bucket.mapjoin.tez: 配置是否开启转换成桶MapJoin的表连接。默认是false,表示不开启。

hive.merge.tezifles 是否合并Tez任务最终产生的小文件。

hive.tez.cpu.vcores 配置每个容器运行所需的虚拟CPU个数。

hive.tez.auto.reducer.parallelism 配置是否开启作业自动调节在Reduce阶段的任务并行度

hive.llap.io.enabled 是否启用LLAP的数据I/O。

hive.llap.io.cache.orc.size LLAP缓存数据的大小,默认是1GB。

hive.llap.io.memory.size LLAP缓存数据的最大值。

hive.llap.auto.enforce.vectorized:是否强制使用向量化的运行方式,默认为true。


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #hive #Vectorized #1 #思路11 #查看explain #查看yarn日志13