hive on spark 相关调优

一、yarn相关调优

需要调整的Yarn参数均与CPU、内存等资源有关,核心配置参数如下

(1)yarn.nodemanager.resource.memory-mb

该参数的含义是,一个NodeManager节点分配给Container使用的内存。该参数的配置,取决于NodeManager所在节点的总内存容量和该节点运行的其他服务的数量。

考虑上述因素,此处可将该参数设置为64G,如下:

<property>

    <name>yarn.nodemanager.resource.memory-mb</name>

    <value>65536</value>

</property>

(2)yarn.nodemanager.resource.cpu-vcores

该参数的含义是,一个NodeManager节点分配给Container使用的CPU核数。该参数的配置,同样取决于NodeManager所在节点的总CPU核数和该节点运行的其他服务。

考虑上述因素,此处可将该参数设置为16。

<property>

    <name>yarn.nodemanager.resource.cpu-vcores</name>

    <value>16</value>

</property>

(3)yarn.scheduler.maximum-allocation-mb

该参数的含义是,单个Container能够使用的最大内存。由于Spark的yarn模式下,Driver和Executor都运行在Container中,故该参数不能小于Driver和Executor的内存配置,推荐配置如下:

<property>

    <name>yarn.scheduler.maximum-allocation-mb</name>

    <value>16384</value>

</property>

(4)yarn.scheduler.minimum-allocation-mb

该参数的含义是,单个Container能够使用的最小内存,推荐配置如下:

<property>

    <name>yarn.scheduler.minimum-allocation-mb</name>

    <value>512</value>

</property> 

二、spark相关调优

2.1   Executor CPU核数配置

单个Executor的CPU核数,由spark.executor.cores参数决定,建议配置为4-6,具体配置为多少,视具体情况而定,原则是尽量充分利用资源。

此处单个节点共有16个核可供Executor使用,则spark.executor.core配置为4最合适。原因是,若配置为5,则单个节点只能启动3个Executor,会剩余1个核未使用;若配置为6,则只能启动2个Executor,会剩余4个核未使用。

2.2 Executor内存配置

Executor相关的参数有:spark.executor.memory和spark.executor.memoryOverhead。spark.executor.memory用于指定Executor进程的堆内存大小,这部分内存用于任务的计算和存储;spark.executor.memoryOverhead用于指定Executor进程的堆外内存,这部分内存用于JVM的额外开销,操作系统开销等。

spark.executor.memory    14G

spark.executor.memoryOverhead    2G

2.3 Executor个数配置

1)静态分配

可通过spark.executor.instances指定一个Spark应用启动的Executor个数。这种方式需要自行估计每个Spark应用所需的资源,并为每个应用单独配置Executor个数。

2)动态分配

    动态分配可根据一个Spark应用的工作负载,动态的调整其所占用的资源(Executor个数)。这意味着一个Spark应用程序可以在运行的过程中,需要时,申请更多的资源(启动更多的Executor),不用时,便将其释放。

在生产集群中,推荐使用动态分配。动态分配相关参数如下:

#启动动态分配

spark.dynamicAllocation.enabled    true

#启用Spark shuffle服务

spark.shuffle.service.enabled    true

#Executor个数初始值

spark.dynamicAllocation.initialExecutors    1

#Executor个数最小值

spark.dynamicAllocation.minExecutors    1

#Executor个数最大值

spark.dynamicAllocation.maxExecutors    12

#Executor空闲时长,若某Executor空闲时间超过此值,则会被关闭

spark.dynamicAllocation.executorIdleTimeout    60s

#积压任务等待时长,若有Task等待时间超过此值,则申请启动新的Executor

spark.dynamicAllocation.schedulerBacklogTimeout    1s

#使用旧版的shuffle文件Fetch协议

spark.shuffle.useOldFetchProtocol true

说明:Spark shuffle服务的作用是管理Executor中的各Task的输出文件,主要是shuffle过程map端的输出文件。由于启用资源动态分配后,Spark会在一个应用未结束前,将已经完成任务,处于空闲状态的Executor关闭。Executor关闭后,其输出的文件,也就无法供其他Executor使用了。需要启用Spark shuffle服务,来管理各Executor输出的文件,这样就能关闭空闲的Executor,而不影响后续的计算任务了。

2.4 Driver配置说明

Driver主要配置内存即可,相关的参数有spark.driver.memory和spark.driver.memoryOverhead。

spark.driver.memory用于指定Driver进程的堆内存大小,spark.driver.memoryOverhead用于指定Driver进程的堆外内存大小。默认情况下,两者的关系如下:spark.driver.memoryOverhead=spark.driver.memory*0.1。两者的和才算一个Driver进程所需的总内存大小。

一般情况下,按照如下经验进行调整即可:假定yarn.nodemanager.resource.memory-mb设置为X,

若X>50G,则Driver可设置为12G,

若12G<X<50G,则Driver可设置为4G。

若1G<X<12G,则Driver可设置为1G。

此处yarn.nodemanager.resource.memory-mb为64G,则Driver的总内存可分配12G,所以上述两个参数可配置为

spark.driver.memory    10G

spark.yarn.driver.memoryOverhead    2G

三、分组聚合调优

优化思路为map-side聚合。所谓map-side聚合,就是在map端维护一个hash table,利用其完成分区内的、部分的聚合,然后将部分聚合的结果,发送至reduce端,完成最终的聚合。map-side聚合能有效减少shuffle的数据量,提高分组聚合运算的效率。

map-side 聚合相关的参数如下:

--启用map-side聚合

set hive.map.aggr=true;

--hash map占用map端内存的最大比例

set hive.map.aggr.hash.percentmemory=0.5;

四、join优化

上述参与join的两表一大一小,可考虑map join优化。

Map Join相关参数如下:

--启用map join自动转换

set hive.auto.convert.join=true;

--common join转map join小表阈值

set hive.auto.convert.join.noconditionaltask.size

五、数据倾斜优化

5.1 group导致数据倾斜

5.1.1 map-side聚合

5.1.2 skew groupby优化

其原理是启动两个MR任务,第一个MR按照随机数分区,将数据分散发送到Reduce,完成部分聚合,第二个MR按照分组字段分区,完成最终聚合。

相关参数如下:

--启用分组聚合数据倾斜优化

set hive.groupby.skewindata=true;

5.2 join导致数据倾斜

5.2.1 使用map join

5.2.2 启动skew join

相关参数如下:

--启用skew join优化

set hive.optimize.skewjoin=true;

--触发skew join的阈值,若某个key的行数超过该参数值,则触发

set hive.skewjoin.key=100000;

需要注意的是,skew join只支持Inner Join。

六、任务并行度优化

对于一个分布式的计算任务而言,设置一个合适的并行度十分重要。在Hive中,无论其计算引擎是什么,所有的计算任务都可分为Map阶段和Reduce阶段。所以并行度的调整,也可从上述两个方面进行调整。

6.1 Map阶段并行度

Map端的并行度,也就是Map的个数。是由输入文件的切片数决定的。一般情况下,Map端的并行度无需手动调整。Map端的并行度相关参数如下:

--可将多个小文件切片,合并为一个切片,进而由一个map任务处理

set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

--一个切片的最大值

set mapreduce.input.fileinputformat.split.maxsize=256000000;

6.2 Reduce阶段并行度

Reduce端的并行度,相对来说,更需要关注。默认情况下,Hive会根据Reduce端输入数据的大小,估算一个Reduce并行度。但是在某些情况下,其估计值不一定是最合适的,此时则需要人为调整其并行度。

Reduce并行度相关参数如下:

--指定Reduce端并行度,默认值为-1,表示用户未指定

set mapreduce.job.reduces;

--Reduce端并行度最大值

set hive.exec.reducers.max;

--单个Reduce Task计算的数据量,用于估算Reduce并行度

set hive.exec.reducers.bytes.per.reducer;

Reduce端并行度的确定逻辑为,若指定参数mapreduce.job.reduces的值为一个非负整数,则Reduce并行度为指定值。否则,Hive会自行估算Reduce并行度,估算逻辑如下:

假设Reduce端输入的数据量大小为totalInputBytes

参数hive.exec.reducers.bytes.per.reducer的值为bytesPerReducer

参数hive.exec.reducers.max的值为maxReducers

则Reduce端的并行度为:

min⁡(ceiltotalInputBytesbytesPerReducer,maxReducers)

其中,Reduce端输入的数据量大小,是从Reduce上游的Operator的Statistics(统计信息)中获取的。为保证Hive能获得准确的统计信息,需配置如下参数:

--执行DML语句时,收集表级别的统计信息

set hive.stats.autogather=true;

--执行DML语句时,收集字段级别的统计信息

set hive.stats.column.autogather=true;

--计算Reduce并行度时,从上游Operator统计信息获得输入数据量

set hive.spark.use.op.stats=true;

--计算Reduce并行度时,使用列级别的统计信息估算输入数据量

set hive.stats.fetch.column.stats=true;

七、小文件合并优化

7.1 Map端输入文件合并

合并Map端输入的小文件,是指将多个小文件划分到一个切片中,进而由一个Map Task去处理。目的是防止为单个小文件启动一个Map Task,浪费计算资源。

相关参数为:

--可将多个小文件切片,合并为一个切片,进而由一个map任务处理

set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

7.2 Reduce输出文件合并

合并Reduce端输出的小文件,是指将多个小文件合并成大文件。目的是减少HDFS小文件数量。

相关参数为:

--开启合并Hive on Spark任务输出的小文件

set hive.merge.sparkfiles=true;

八、CBO优化

开启CBO可以自动调整join顺序

相关参数为:

--是否启用cbo优化

set hive.cbo.enable=true;

九、谓词下推

将过滤操作前移

相关参数为:

--是否启动谓词下推(predicate pushdown)优化

set hive.optimize.ppd = true;

需要注意的是:

CBO优化也会完成一部分的谓词下推优化工作,因为在执行计划中,谓词越靠前,整个计划的计算成本就会越低。

十、矢量化查询

 Hive的矢量化查询,可以极大的提高一些典型查询场景(例如scans, filters, aggregates, and joins)下的CPU使用效率。

相关参数如下:

set hive.vectorized.execution.enabled=true;

若执行计划中,出现“Execution mode: vectorized”字样,即表明使用了矢量化计算。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值