Python Spark / Yarn 内存使用情况

Posted

技术标签:

【中文标题】Python Spark / Yarn 内存使用情况【英文标题】:Python Spark / Yarn memory usage 【发布时间】:2016-06-24 16:52:01 【问题描述】:

我有一个 spark python 应用程序,由于超出内存限制而被 yarn 杀死。我有一个步骤涉及加载一些有点重的资源(500+ MB),所以我正在使用 mapPartitions。基本上:

def process_and_output(partition):
    resources = load_resources()
    for record in partition:
        yield transform_record(resources, record)

input = sc.textFile(input_location)
processed = input.mapPartitions(process_and_output)
processed.saveAsTextFile(output_location)

运行时,我一直收到此错误:

错误 YarnScheduler: Lost executor 1 on (address removed): 容器因超出内存限制而被 YARN 杀死。使用了 11.4 GB 的 11.2 GB 物理内存。考虑提升 spark.yarn.executor.memoryOverhead。

我尝试将 memoryOverhead 提高到极高,但仍然是同样的问题。我跑了:

--conf "spark.python.worker.memory=1200m" \
--conf "spark.yarn.executor.memoryOverhead=5300" \
--conf "spark.executor.memory=6g" \

当然,内存开销够了吗?

我想更一般地说,我很难理解 python 工作者的内存是如何控制/计算在总体总数中的。有这方面的文件吗?

我还想了解使用生成器函数是否会真正减少内存使用量。它会通过 python 进程流式传输数据(就像我希望的那样),还是会在发送回 JVM/spark 基础设施之前缓冲所有数据?

【问题讨论】:

【参考方案1】:

Yarn 在它的时候杀死 executor

memory usage > (executor-memory + executor.memoryOverhead)

从您的设置看来,这是一个有效的例外。

(memory usage) 11.4GB > 11.18GB (executor-memory=6GB + memoryOverhead=5.18GB)

试试

--conf "spark.yarn.executor.memoryOverhead=6144"`

【讨论】:

喜欢这个解释。感谢您保持真实。 帮帮我! THX【参考方案2】:

正如您所见,11.2 GB 是由 yarn 创建的容器的最大内存。它等于执行器内存+开销。所以python内存不算在内。

Exception 希望您增加开销,但您可以只增加执行程序内存而不增加开销内存。我只能说这么多,但不知道为什么单个执行程序需要这么多内存,可能是笛卡尔或类似的东西可能需要这么多内存。

【讨论】:

【参考方案3】:

两年半后...我碰巧在阅读spark release notes 并看到这个:

添加 spark.executor.pyspark.memory 限制

有了这个链接的错误:https://issues.apache.org/jira/browse/SPARK-25004

我早就解决了我最初的问题,然后换了工作,所以我不再有能力尝试这个。但我怀疑这可能正是我遇到的问题。

【讨论】:

这非常有用。谢谢!

以上是关于Python Spark / Yarn 内存使用情况的主要内容,如果未能解决你的问题,请参考以下文章

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

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

在 YARN 中为 Apache zeppelin 分配 Spark 内存

Spark记录-Spark On YARN内存分配(转载)

配置Spark on YARN集群内存

配置Spark on YARN集群内存