apache-spark - 为什么在增加 memoryOverhead 后收集大型数据集会成功
问题描述
介绍
在 apache spark 文档中,我看到内存分为三组,可以使用多个参数进行配置。假设我们有一台 AWS EMR 机器 m4.xlarge。在这台机器上,Yarn 的最大分配内存等于 12288 MB。使用这些配置参数:
- spark.(executor|driver).memoryOverhead = 0.2
- spark.(executor|driver).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 地图[(长,长)]),然后我打算将其广播给所有执行者。当我在没有明确指定开销(默认为 0.1)的情况下进行收集时,集群失败,容器因超出内存限制而被 YARN 杀死,但开销为 0.2 时一切顺利。似乎我的 Map 存储在开销中,但是执行程序存储的目的是什么?
提前致谢!
解决方案
唯一能够通过反复试验来识别的是 f.ex。在将数据收集到驱动程序内存时,开销需要能够容纳它,这表明收集土地在开销中。
然而,广播变量需要适合 ,executor.memory
似乎memoryOverhead
不受此影响。
推荐阅读
- c - 在二进制文件中激发一个条件
- r - 删除 R 中的行
- python - 使用 tkinter 在 GUI 中停止 gif
- html - 如何从常规 DIV 制作固定背景
- c# - RaspPi .net 使用 gpio(c# 和单声道)形成崩溃
- amazon-web-services - 在烧瓶应用程序中出现 403 禁止错误
- javascript - 如何在 React Native 中隐藏底部操作栏
- c++ - 我可以在命名空间中包含头文件吗?
- ssl - 自定义 OpenSSL 配置文件以使其与自定义引擎和 TLS v1.0 一起使用
- javascript - 通过数组 node.js 中的项目进行映射