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.coresExecutor 线程池:线程可以复用,但同一时间中,每个线程只能计算一个任务
执行内存大小:
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 线程池和执行内存大小的算法:
