• SparkSQL执行时参数优化


    • 具体现象

      1. 内存CPU比例失调 一个Spark任务消耗 120(executor)*4G = 480G内存仅仅使用120个 core.几个SprakSQL任务就将整个系统资源吃光.
      2. 设置超过40个executor,但未指定分区数,导致多数executor空闲.
    • 原因分析

    • SparkSQL配置时Core与内存比例不恰当

    • 没有指定executor核心数

    • 未进行其他配置参数优化

    • 解决办法

      1. 在配置SparkSQL任务时指定executor核心数 建议为4
        (同一executor[进程]内内存共享,当数据倾斜时,使用相同核心数与内存量的两个任务,executor总量少的任务不容易OOM,因为单核心最大可用内存大.但是并非越大越好,因为单个exector最大core受服务器剩余core数量限制,过大的core数量可能导致资源分配不足)  
      2. 设置spark.default.parallelism=600 每个stage的默认task数量
        (计算公式为num-executors * executor-cores 系统默认值分区为40,这是导致executor并行度上不去的罪魁祸首,之所以这样计算是为了尽量避免计算最慢的task决定整个stage的时间,将其设置为总核心的2-3倍,让运行快的task可以继续领取任务计算直至全部任务计算完毕)
      3. 开启spark.sql.auto.repartition=true 自动重新分区
        (每个stage[阶段]运行时分区并不尽相同,使用此配置可优化计算后分区数,避免分区数过大导致单个分区数据量过少,每个task运算分区数据时时间过短,从而导致task频繁调度消耗过多时间)
      4. 设置spark.sql.shuffle.partitions=400 提高shuffle并行度
        (shuffle read task的并行度)
      5. 设置spark.shuffle.service.enabled=true 提升shuffle效率 --!并未测试
        (Executor 进程除了运行task 也要进行写shuffle 数据,当Executor进程任务过重时,导致GC不能为其他Executor提供shuffle数据时将会影响效率.此服务开启时代替Executor来抓取shuffle数据)


    以下为SparkSQL调优相关设置
     

    以下列表中动态资源分配相关不建议使用

    //1.下列Hive参数对Spark同样起作用。
    set hive.exec.dynamic.partition=true; // 是否允许动态生成分区
    set hive.exec.dynamic.partition.mode=nonstrict; // 是否容忍指定分区全部动态生成
    set hive.exec.max.dynamic.partitions = 100; // 动态生成的最多分区数
    
    //2.运行行为
    set spark.sql.autoBroadcastJoinThreshold; // 大表 JOIN 小表,小表做广播的阈值
    set spark.dynamicAllocation.enabled; // 开启动态资源分配
    set spark.dynamicAllocation.maxExecutors; //开启动态资源分配后,最多可分配的Executor数
    set spark.dynamicAllocation.minExecutors; //开启动态资源分配后,最少可分配的Executor数
    set spark.sql.shuffle.partitions; // 需要shuffle是mapper端写出的partition个数
    set spark.sql.adaptive.enabled; // 是否开启调整partition功能,如果开启,spark.sql.shuffle.partitions设置的partition可能会被合并到一个reducer里运行
    set spark.sql.adaptive.shuffle.targetPostShuffleInputSize; //开启spark.sql.adaptive.enabled后,两个partition的和低于该阈值会合并到一个reducer
    set spark.sql.adaptive.minNumPostShufflePartitions; // 开启spark.sql.adaptive.enabled后,最小的分区数
    set spark.hadoop.mapreduce.input.fileinputformat.split.maxsize; //当几个stripe的大小大于该值时,会合并到一个task中处理
    
    //3.executor能力
    set spark.executor.memory; // executor用于缓存数据、代码执行的堆内存以及JVM运行时需要的内存
    set spark.yarn.executor.memoryOverhead; //Spark运行还需要一些堆外内存,直接向系统申请,如数据传输时的netty等。
    set spark.sql.windowExec.buffer.spill.threshold; //当用户的SQL中包含窗口函数时,并不会把一个窗口中的所有数据全部读进内存,而是维护一个缓存池,当池中的数据条数大于该参数表示的阈值时,spark将数据写到磁盘
    set spark.executor.cores; //单个executor上可以同时运行的task数
    

      

    当任务数据量过大时,还可以根据具体资源情况,增大以下参数:

    --conf spark.sql.shuffle.partitions

    --conf spark.executor.instances

    --conf spark.dynamicAllocation.maxExecutors

    另外,对于Spark SQL 来说,提高并行度时设置 spark.default.parallelism 这个参数时无用的,spark.sql.shuffle.partitions才是决定Spark sql执行并行度的关键。

    原因在于:

    spark.default.parallelism这个参数是在处理RDD时才会起作用的,对Spark sql来说是无效的。

    针对Spark sql任务,则是专门提供了spark.sql.shuffle.partitions这样的参数来控制并行度。

     

    转自:

    https://www.cnblogs.com/-zzz/p/10629226.html

    https://blog.csdn.net/Jack_Roy/article/details/89639784

    https://blog.csdn.net/Jack_Roy  (博主写的很细致)

  • 相关阅读:
    wsl手动启动特定的子系统
    winserver安装wsl
    wsl子系统下载地址-补充centos7地址
    wsl (1)-含wsl子系统各启动命令
    win10系统版本说明
    zenith 以及海康 rtsp流
    shinobi (4)
    ffmpeg
    CF993A Two Squares 几何 第二道 暴力或判断条件(*)
    CF994B Knights of a Polygonal Table 第一道 贪心 set/multiset的用法
  • 原文地址:https://www.cnblogs.com/Allen-rg/p/12937605.html
Copyright © 2020-2023  润新知