激发堆内存配置和钨

spark off heap memory config and tungsten

我以为集成了项目Tungesten,spark会自动使用堆外内存

spark.memory.offheap.size 和 spark.memory.offheap.enabled 有什么用?我是否需要在这里手动指定 Tungsten 的堆外内存量?

Spark/Tungsten 使用 Encoders/Decoders 将 JVM objects 表示为高度专业化的 Spark SQL 类型 objects 然后可以在高性能的方式。内部格式表示高效且对GC内存利用友好。

因此,即使在默认 on-heap 模式下运行 Tungsten 也减轻了 JVM objects 内存布局和 GC 运行时间的巨大开销。在这种模式下,Tungsten 确实 在堆上分配 objects 用于其内部目的,分配的内存块可能很大,但它发生的频率要低得多,并且在 GC 生成过渡过程中顺利进行。这几乎消除了考虑移动这个内部结构的需要 off-heap。

在我们打开和关闭此模式的实验中,我们没有看到显着的 运行 时间改进。但是你在 off-heap 模式下得到的是需要仔细设计 JVM 进程之外的内存分配。当您需要允许和规划除 JVM 进程配置之外的额外内存块时,这可能会给 YARN、Mesos 等容器管理器带来一些困难。

此外,在 off-heap 模式下,Tungsten 使用 sun.misc.Unsafe,这在您的部署场景中可能不是所希望的,甚至是不可能的(例如,使用限制性 java 安全管理器配置)。

我还分享了乔什·罗森 (Josh Rosen) 被问到类似问题时的时间标记视频会议 talk

spark.memory.offheap.size和spark.memory.offheap.enabled有什么用? spark.memory.offHeap.enabled:参数为enable/disable使用off-heap内存。 spark.memory.offHeap.size:off-heap 分配的内存总量(以字节为单位)(来自本机内存)。它对堆内存使用没有影响,还要确保不要超过执行程序的总限制。

我是否需要在这里手动指定 Tungsten 的 off-heap 内存量? 是的。 除了启用 OffHeap 内存外,您还需要手动设置其大小以使用 Off-Heap 内存用于 spark 应用程序。请注意,Off-heap 内存模型仅包括存储内存和执行内存。

下图是Off-Heap内存起作用时的抽象概念。

• 如果启用Off-heap内存,则执行器中将同时存在On-heap和Off-heap内存。

• 执行器内存=内存On-Heap+内存Off-Heap

• 执行器的执行内存=执行内存On-Heap+执行内存Off-Heap