SparkSQL执行时参数优化
程序员文章站
2022-05-24 19:26:20
具体现象 内存CPU比例失调 一个Spark任务消耗 120(executor)*4G = 480G内存仅仅使用120个 core.几个SprakSQL任务就将整个系统资源吃光. 设置超过40个executor,但未指定分区数,导致多数executor空闲. 原因分析 SparkSQL配置时Core ......
-
具体现象
- 内存cpu比例失调 一个spark任务消耗 120(executor)*4g = 480g内存仅仅使用120个 core.几个spraksql任务就将整个系统资源吃光.
- 设置超过40个executor,但未指定分区数,导致多数executor空闲.
-
原因分析
-
sparksql配置时core与内存比例不恰当
-
没有指定executor核心数
-
未进行其他配置参数优化
-
解决办法
-
在配置sparksql任务时指定executor核心数 建议为4
(同一executor[进程]内内存共享,当数据倾斜时,使用相同核心数与内存量的两个任务,executor总量少的任务不容易oom,因为单核心最大可用内存大.但是并非越大越好,因为单个exector最大core受服务器剩余core数量限制,过大的core数量可能导致资源分配不足) -
设置spark.default.parallelism=600 每个stage的默认task数量
(计算公式为num-executors * executor-cores 系统默认值分区为40,这是导致executor并行度上不去的罪魁祸首,之所以这样计算是为了尽量避免计算最慢的task决定整个stage的时间,将其设置为总核心的2-3倍,让运行快的task可以继续领取任务计算直至全部任务计算完毕) -
开启spark.sql.auto.repartition=true 自动重新分区
(每个stage[阶段]运行时分区并不尽相同,使用此配置可优化计算后分区数,避免分区数过大导致单个分区数据量过少,每个task运算分区数据时时间过短,从而导致task频繁调度消耗过多时间) -
设置spark.sql.shuffle.partitions=400 提高shuffle并行度
(shuffle read task的并行度) -
设置spark.shuffle.service.enabled=true 提升shuffle效率 --!并未测试
(executor 进程除了运行task 也要进行写shuffle 数据,当executor进程任务过重时,导致gc不能为其他executor提供shuffle数据时将会影响效率.此服务开启时代替executor来抓取shuffle数据)
-
在配置sparksql任务时指定executor核心数 建议为4
前后资源配置对比
类型 | 内存数量 | cpu核心数量 | executor数量 | executor内存 | 单核心内存 |
---|---|---|---|---|---|
系统资源总量 | 7168g | 3500 | - | 4g | 2g |
目前一个任务 | 480g | 120 | 120 | 4g | 4g |
优化后 | 480g | 240 | 60 | 8g | 2g |
以下为sparksql调优相关设置
以下列表中动态资源分配相关不建议使用
1 //1.下列hive参数对spark同样起作用。 2 set hive.exec.dynamic.partition=true; // 是否允许动态生成分区 3 set hive.exec.dynamic.partition.mode=nonstrict; // 是否容忍指定分区全部动态生成 4 set hive.exec.max.dynamic.partitions = 100; // 动态生成的最多分区数 5 6 //2.运行行为 7 set spark.sql.autobroadcastjointhreshold; // 大表 join 小表,小表做广播的阈值 8 set spark.dynamicallocation.enabled; // 开启动态资源分配 9 set spark.dynamicallocation.maxexecutors; //开启动态资源分配后,最多可分配的executor数 10 set spark.dynamicallocation.minexecutors; //开启动态资源分配后,最少可分配的executor数 11 set spark.sql.shuffle.partitions; // 需要shuffle是mapper端写出的partition个数 12 set spark.sql.adaptive.enabled; // 是否开启调整partition功能,如果开启,spark.sql.shuffle.partitions设置的partition可能会被合并到一个reducer里运行 13 set spark.sql.adaptive.shuffle.targetpostshuffleinputsize; //开启spark.sql.adaptive.enabled后,两个partition的和低于该阈值会合并到一个reducer 14 set spark.sql.adaptive.minnumpostshufflepartitions; // 开启spark.sql.adaptive.enabled后,最小的分区数 15 set spark.hadoop.mapreduce.input.fileinputformat.split.maxsize; //当几个stripe的大小大于该值时,会合并到一个task中处理 16 17 //3.executor能力 18 set spark.executor.memory; // executor用于缓存数据、代码执行的堆内存以及jvm运行时需要的内存 19 set spark.yarn.executor.memoryoverhead; //spark运行还需要一些堆外内存,直接向系统申请,如数据传输时的netty等。 20 set spark.sql.windowexec.buffer.spill.threshold; //当用户的sql中包含窗口函数时,并不会把一个窗口中的所有数据全部读进内存,而是维护一个缓存池,当池中的数据条数大于该参数表示的阈值时,spark将数据写到磁盘 21 set spark.executor.cores; //单个executor上可以同时运行的task数
上一篇: js实现年月日表单三级联动
下一篇: MAYA入门教程 基本指令操作