Spark 内存管理之 MemoryPool

MemoryManager 定义了以下4个 memory pool,分为两种,StorageMemoryPool 和 ExecutionMemoryPool。

@GuardedBy("this")
  protected val onHeapStorageMemoryPool = new StorageMemoryPool(this, MemoryMode.ON_HEAP)
  @GuardedBy("this")
  protected val offHeapStorageMemoryPool = new StorageMemoryPool(this, MemoryMode.OFF_HEAP)
  @GuardedBy("this")
  protected val onHeapExecutionMemoryPool = new ExecutionMemoryPool(this, MemoryMode.ON_HEAP)
  @GuardedBy("this")
  protected val offHeapExecutionMemoryPool = new ExecutionMemoryPool(this, MemoryMode.OFF_HEAP)

MemoryPool

StorageMemoryPool 和 ExecutionMemoryPool 都继承自 MemoryPool。

这4个 memory pool 共用 MemoryManager 对象作为锁。
MemoryPool 保留了最基本的 pool size 的记账操作。

StorageMemoryPool

管理 cache 数据块的内存。
StorageMemoryPool 和 ExecutionMemoryPool 之间的区别是:
StorageMemoryPool 有 memoryStore,可以调用 memoryStore.evictBlocksToFreeSpace 来释放空间。

ExecutionMemoryPool

管理 task 的执行内存。每个 task 使用的内存在 maxMemoryPerTask 和 minMemoryPerTask 之间。

val maxMemoryPerTask = maxPoolSize / numActiveTasks
val minMemoryPerTask = poolSize / (2 * numActiveTasks)

以后可能优化点:由于每个 Task 使用的内存在 poolSize / (2 * numActiveTasks)maxPoolSize / numActiveTasks 之间,当container 有 2 个 active task 时,处理数据量大的 task 不能多占用空间。如数据倾斜时。

你可能感兴趣的:(spark)