Spark 将内存分 :
线程/执行内存关系:
执行内存抢占规则 : 在同个 Executor 有 N 个线程尝试抢占执行内存
抢占原则:
平衡 CPU/内存的 3 类配置参数 : 并行度、集群的并行计算能力、执行内存大小
并行度 :分布式数据集的划分数
并行度的配置项 :
spark.default.parallelism
: 设置 RDD 的默认并行度spark.sql.shuffle.partitions
: Spark SQL 指定 Shuffle Reduce 默认的并行度并发度 : 同一时间内,一个 Executor 能同时运行的最大任务数量
spark.executor.cores
:Executor 的线程池大小spark.task.cpus
:每个任务在运行时要消耗的线程数spark.task.cpus
默认为 1,并发度默认为 spark.executor.cores
Executor 线程池:线程可以复用,但同一时间中,每个线程只能计算一个任务
执行内存大小:
spark.executor.memory * spark.memory.fraction * (1 - spark.memory.storageFraction)
spark.memory.offHeap.size * (1 - spark.memory.storageFraction)
线程挂起的原因 :
动态变化的执行内存总量 M :
spark.executor.memory * spark.memory.fraction
线程总数 (N) 是固定 :
spark.executor.cores/spark.task.cpus
数据分片的数据量决定了任务要申请多少内存
并行度设到最大,每个数据分片足够小,小到每个 CPU 线程都能申请到内存
定 Executor 线程池和执行内存大小的算法: