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