每日一题简要介绍一下 Spark 的内存管理?

Posted 勾叔谈大数据

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一题简要介绍一下 Spark 的内存管理?相关的知识,希望对你有一定的参考价值。

大家好,我是勾叔。今天的面试题是:简要介绍一下Spark的内存管理。

问题分析

考察对Spark底层原理的理解,Spark对资源要求比较高,如何分配内存、分配多少内存、内存被消耗在哪里了都需要了解。

核心问题回答

【每日一题】简要介绍一下 Spark 的内存管理?

Spark集群会启动 Driver 和 Executor 两种JVM进程,前者为主控进程,后者负责执行具体的计算任务。一个应用程序有一个Driver和多个Executor,缺省情况下二者分配的内存都是1G。Driver的内存管理简单,这里介绍的内存管理指的是Executor的内存管理。
Spark 可以使用 JVM 堆内存,但不能精准控制堆内内存的申请和释放;Spark 1.6 引入了堆外内存,直接在工作节点的系统内存中开辟空间,存储经过序列化的二进制数据。堆外内存空间的占用可以被精确计算,相比堆内内存来说降低了管理的难度,减少了误差。
Executor 内运行的并发任务共享 JVM 堆内存,按照用途分为:
  • Storage(存储内存):缓存 RDD 数据和广播变量数据
  • Execution(执行内存):执行Shuffle时占用的内存
  • Other(剩余空间):存储 Spark 内部的对象实例,和用户定义的Spark应用程序中的对象实例

Spark 1.6之前的内存管理采用静态内存管理机制,启动前配置各个区域占比,运行过程中各内存区间的大小均是固定的。堆内内存默认 Storage:Execution:Other为6:2:2,堆外内存没有other区,默认Storage:Execution=1:1。由于 Spark 堆内内存大小的记录是不准确的,Storage 内存和 Execution 内存都有预留空间防止OOM。堆外内存不需要。

Spark 1.6之后引入统一内存管理,存储内存和执行内存共享同一存储空间,可以动态占用对方的空闲区域。运行前设定存储内存和执行内存的比例,运行时:
  • 双方的空间都不足时,则存储到硬盘;若己方空间不足而对方空余时,可借用对方的空间;(存储空间不足是指不足以放下一个完整的 Block)
  • Execution执行内存的空间被对方占用后,可让对方将占用的部分转存到硬盘,然后"归还"借用的空间
  • 存储内存的空间被Execution执行内存占用后,无法让对方"归还"
  • other还是固定的

问题扩展

【每日一题】简要介绍一下 Spark 的内存管理?

Shuffle过程中,内存的使用。

结合项目使用


能合理的分配内存。
大家如果想进行更深入的了解和学习,请关注勾叔谈大数据参与更多互动。



推荐阅读:



以上是关于每日一题简要介绍一下 Spark 的内存管理?的主要内容,如果未能解决你的问题,请参考以下文章

spark从入门到精通spark内存管理详解- 堆内&堆外内存管理

Android面试每日一题: 哪些情况下会导致oom问题?

Android面试每日一题: 哪些情况下会导致oom问题?

爱创课堂每日一题101天-哪些操作会造成内存泄漏?

老男孩教育每日一题-2017年3月21日:查找占用内存的前3名进程

阿铭每日一题 day 6 20180116