Spark+yarn - 使用输入大小缩放内存

Posted

技术标签:

【中文标题】Spark+yarn - 使用输入大小缩放内存【英文标题】:Spark+yarn - scale memory with input size 【发布时间】:2017-02-03 15:27:40 【问题描述】:

我正在使用 pyspark 在纱线集群上运行火花。我有一个数据集,它需要为每个键加载几个二进制文件,然后运行一些难以分解为部分的计算——因此它通常必须针对单个键对所有数据进行操作。

目前,我将 spark.executor.memory 和 spark.yarn.executor.memoryOverhead 设置为“正常”的值,这些值在大多数情况下都有效,但是某些键最终具有比平均值大得多的数据量,并且在在这些情况下,内存不足,执行者最终被杀死。

我目前正在执行以下操作之一: 1)使用默认内存设置运行作业,并在某些键因更多内存而失败时重新运行 2)如果我知道我的一个键有更多的数据,我可以扩展整个作业的内存,但是这样的缺点是大大减少了我得到的运行容器的数量/并行运行的作业数量。

理想情况下,我应该有一个系统,我可以在该系统中发送一份工作,并将内存放在具有输入大小的执行器规模中,但我知道这不是 spark 的模型。是否有任何额外的设置可以帮助我或解决这个问题的任何技巧?我缺少什么明显的修复方法?

【问题讨论】:

【参考方案1】:

您可以测试以下方法:将执行程序内存和执行程序纱线开销设置为最大值,并添加数字大于 1 的spark.executor.cores(从 2 开始)。另外将spark.task.maxFailures 设置为某个大数字(比如说10)。

然后在正常大小的键上,spark 可能会像往常一样完成任务,但某些具有较大键的分区会失败。它们将被添加到重试阶段,由于要重试的分区数量将远低于初始分区,spark 会将它们平均分配给执行器。如果分区数小于或等于执行程序数,则每个分区的内存将是初始执行的两倍,并且可能会成功。

让我知道它是否适合你。

【讨论】:

这有点工作,但在长时间运行的作业中它仍然是半不稳定的,并且在某些时候我最终仍然会完全失败(即使 maxFailures [>30-50] 非常高)。但是,还是比以前好很多。谢谢

以上是关于Spark+yarn - 使用输入大小缩放内存的主要内容,如果未能解决你的问题,请参考以下文章

在 Spark-on-Yarn 中配置 Executor 和 Driver 内存

Spark运行内存溢出--->spark.yarn.executor.memoryOverhead

Python Spark / Yarn 内存使用情况

YARN 上 Spark 应用程序的物理内存使用量不断增加

YARN 上的 Spark 使用的 vcore 太少

在 YARN 中为 Apache zeppelin 分配 Spark 内存