Spark1.6.+ - 之内存管理
1、前言
在Spark1.6.+及以后的版本就引入了用户自定义的内存管理模型,但是是粗粒度的内存管理模型。
总的来说,Spark的内存管理虽然没有做到Flink那么细粒度,但是也已经足够用于对内存进行优化了。
Spark的每个运行时组件都是运行在一个独立的container中,这个container的启动内存由以下4个主要的大的内存配置进行确定,我们按照executor的内存单独来看,如下!~
- spark.executor.memory (heap size)
- spark.executor.memoryOverhead (overhead)
- spark.memory.offHeap.size (off-heap)
- executor运行的堆外内存、不受JVM GC的影响,默认不开启
- spark.executor.pyspark.memory (not set,默认按MB除非指定其它的单位)
TOTAL CONTAINER MEMORY = spark.executor.memory + spark.executor.memoryOverhead + spark.memory.offHeap.size + spark.executor.pyspark.memory
2、内存配置详解
spark.executor.memory
executor运行进程的total heap size
spark.executor.memory = spark.memory.fraction + other reversed memory
默认 spark.memory.fraction = spark.executor.memory * 0.6
其它0.4是给用户的数据结构、内部的spark元数据、防止OOM的安全保障预留的一个内存空间
默认 spark.memory.storageFraction = spark.memory.fraction * 0.5,用来存储从外部系统读取的数据块、缓存RDD数据等
另外还有execution memory = spark.memory.fraction * 0.5,用来存储在执行task过程中的中间数据,如网络buffer等
spark.executor.memoryOverhead
默认spark.executor.memoryOverhead = max(0.1 * spark.executor.memory,384MB),这是一块除了heap内存之外分配给每个executor的额外的内存区域,也是保证应用运行可靠的一个内存区域。
spark.memory.offHeap.size
如果我们要引入堆外内存我们需要开启:spark.memory.offHeap.enabled=true
且spark.memory.offHeap.size必须在此时设置成正数,如果整个executor total消费内存要满足一个标准,那么在引入offheap的同时就必须相应减少heap内存(spark.executor.memory)
spark.executor.pyspark.memory
默认没有设置,只有在又pyspark应用的时候需要设置,否则会增大container的内存占用,别的应用也占用不到该资源
|