我认为通过整合Tungesten项目,spark会自动使用堆内存。
spark.memory.offheap.size和spark.memory.offheap.enabled是什么?我是否需要手动指定Tungsten的关闭堆内存量?
答案 0 :(得分:17)
Spark / Tungsten使用编码器/解码器将JVM对象表示为高度专业化的Spark SQL Types对象,然后可以以高性能方式对其进行序列化和操作。内部格式表示非常高效且对GC内存利用率很友好。
因此,即使在默认的堆上模式下运行,Tungsten也可以减轻JVM对象内存布局和GC运行时间的巨大开销。该模式下的钨 在堆上为其内部目的分配对象,并且分配内存块可能很大但是它发生的频率要低得多,并且GC生成过渡平稳地存在。这几乎消除了考虑在堆外移动此内部结构的需要。
在我们开启和关闭此模式的实验中,我们没有看到相当大的运行时间改进。但是你在off-heap模式下得到的是需要仔细设计JVM进程之外的内存分配。当您需要允许并计划除JVM进程配置之外的其他内存块时,这可能会在YARN,Mesos等容器管理器中带来一些困难。
同样在堆外模式下,Tungsten使用sun.misc.Unsafe,这在部署方案中可能不是所希望的甚至可能的(例如,使用限制性的java安全管理器配置)。
当他被问到类似的问题时,我也正在与Josh Rosen分享一个带时间标记的视频会议talk。
答案 1 :(得分:0)
spark.memory.offheap.size和spark.memory.offheap.enabled是什么? spark.memory.offHeap.enabled:启用/禁用堆外内存使用的参数。 spark.memory.offHeap.size:用于堆外分配的内存总量(以字节为单位)(来自本机内存)。这不会影响堆内存的使用,也请确保不要超过执行程序的总限制。
我是否需要在此处手动指定钨的堆外存储量? 是。 除了启用OffHeap内存之外,您还需要手动设置其大小以将Off-Heap内存用于spark应用程序。请注意,堆外内存模型仅包括存储内存和执行内存。
下面的图像是堆外内存运行时的抽象概念。
•如果启用了堆内存,则执行器中将同时有堆内存和堆内存。
•执行器的存储内存=堆上的内存+堆上的内存
•执行器的执行内存=堆上执行内存+堆外执行内存