Apache spark 为什么在增加memoryOverhead后收集大型数据集成功 简介

Apache spark 为什么在增加memoryOverhead后收集大型数据集成功 简介,apache-spark,apache-spark-dataset,Apache Spark,Apache Spark Dataset,在apachespark文档中,我看到内存分为三个组,可以使用几个参数进行配置。 假设我们有一台AWS EMR机器m4.xlarge。在这台机器上,纱线的最大分配内存为12288 MB。使用这些配置参数: spark.(执行者|驱动者)。内存溢出=0.2 spark.(执行器|驱动器)。内存=10g spark.memory.fraction=0.6(默认值) spark.storage.fraction=0.3(默认值) 我得到: 内存开销=2G 执行器内存=10G 执行内存=3G(s

在apachespark文档中,我看到内存分为三个组,可以使用几个参数进行配置。 假设我们有一台AWS EMR机器m4.xlarge。在这台机器上,纱线的最大分配内存为12288 MB。使用这些配置参数:

  • spark.(执行者|驱动者)。内存溢出=0.2
  • spark.(执行器|驱动器)。内存=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
我对驱动程序和执行程序使用相同的配置

首先,这个计算正确吗?这些参数可以吗?我主要想知道它是否会在机器上留下足够的内存,以便f.ex。纱线守护进程不会失败吗

主要问题 这些存储区域中到底存储了什么

我很好奇,因为我正在做一个相当大的收集(创建一个~1.5G的地图[(长,长)]),然后我打算向所有执行者广播。当我在没有明确指定开销(默认值为0.1)的情况下进行收集时,集群失败,容器因超过内存限制而被Thread杀死,但开销为0.2时,一切都顺利进行。似乎我的地图存储在开销中,但执行器存储的目的是什么


提前谢谢

通过反复试验,唯一能够识别的是f.ex。在将数据收集到驱动程序内存时,开销需要能够保存数据,这表明collect会在开销中着陆


然而,广播变量需要放入
执行器内存中
内存头
似乎不受此影响。

可能重复的我不会说它是重复的。请阅读主要问题-我很惊讶,在增加内存开销后,大数据块的收集成功了。除此之外,我说的是
spark.executor.memoryOverhead
而不是
spark.warn.executor.memoryOverhead
。我会尽量把我的问题表达得更清楚。