为什么在增加 memoryOverhead 后收集大型数据集会成功
Why collecting a large dataset succeeds after increasing memoryOverhead
简介
在apache spark文档中我看到内存分为三组,可以使用几个参数进行配置。
假设我们有一台 AWS EMR 机器 m4.xlarge。在这台机器上,Yarn 的最大分配内存等于 12288 MB。使用这些配置参数:
- spark.(执行器|驱动程序).memoryOverhead = 0.2
- spark.(执行器|驱动程序).memory = 10g
- spark.memory.fraction = 0.6(默认值)
- spark.storage.fraction = 0.3(默认值)
我得到:
- 内存开销=2G
- 执行器内存=10G
- 执行内存=3G (
spark.executor.memory * spark.memory.fraction * spark.storage.fraction
)
- 存储内存=3G(
spark.executor.memory * spark.memory.fraction * spark.storage.fraction
)
- 用户内存=4G(
spark.executor.memory * 1-spark.memory.fraction
)
我对驱动程序和执行程序使用相同的配置。
首先 - 这个计算是否正确?这些参数可以吗?我主要想知道它是否会在机器上留下足够的 RAM 以便 f.ex。 YARN 守护进程不会失败?
主要问题
这些内存区域到底存储了什么?
我想知道,因为我正在做一个相当大的收集(创建一个 ~1.5G 地图 [(Long, Long)]),然后我打算将其广播给所有执行者。当我在没有明确指定开销(默认为 0.1)的情况下进行收集时,集群失败了,容器因超出内存限制而被 YARN 杀死,但开销为 0.2 时一切顺利。貌似我的Map存储在开销里,那executor存储的目的是什么?
提前致谢!
通过反复试验,唯一设法确定的是 f.ex。在将数据收集到驱动程序内存时,开销需要能够容纳它,这表明在开销中收集土地。
但是广播变量需要适合 executor.memory
,memoryOverhead
似乎不受此影响。
简介
在apache spark文档中我看到内存分为三组,可以使用几个参数进行配置。 假设我们有一台 AWS EMR 机器 m4.xlarge。在这台机器上,Yarn 的最大分配内存等于 12288 MB。使用这些配置参数:
- spark.(执行器|驱动程序).memoryOverhead = 0.2
- spark.(执行器|驱动程序).memory = 10g
- spark.memory.fraction = 0.6(默认值)
- spark.storage.fraction = 0.3(默认值)
我得到:
- 内存开销=2G
- 执行器内存=10G
- 执行内存=3G (
spark.executor.memory * spark.memory.fraction * spark.storage.fraction
) - 存储内存=3G(
spark.executor.memory * spark.memory.fraction * spark.storage.fraction
) - 用户内存=4G(
spark.executor.memory * 1-spark.memory.fraction
)
- 执行内存=3G (
我对驱动程序和执行程序使用相同的配置。
首先 - 这个计算是否正确?这些参数可以吗?我主要想知道它是否会在机器上留下足够的 RAM 以便 f.ex。 YARN 守护进程不会失败?
主要问题
这些内存区域到底存储了什么?
我想知道,因为我正在做一个相当大的收集(创建一个 ~1.5G 地图 [(Long, Long)]),然后我打算将其广播给所有执行者。当我在没有明确指定开销(默认为 0.1)的情况下进行收集时,集群失败了,容器因超出内存限制而被 YARN 杀死,但开销为 0.2 时一切顺利。貌似我的Map存储在开销里,那executor存储的目的是什么?
提前致谢!
通过反复试验,唯一设法确定的是 f.ex。在将数据收集到驱动程序内存时,开销需要能够容纳它,这表明在开销中收集土地。
但是广播变量需要适合 executor.memory
,memoryOverhead
似乎不受此影响。