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