我有一个火花python应用程序被超过内存限制的纱线杀死。我有一个步骤涉及加载一些有点重(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:丢失的执行程序1打开(地址已删除):由于超出内存限制而被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进程流式传输数据(就像我希望的那样),还是会在发送回JVM / spark基础架构之前将其缓冲起来?
答案 0 :(得分:5)
Yarn在执行者
时杀死它memory usage > (executor-memory + executor.memoryOverhead)
从您的设置看起来它似乎是一个有效的例外。
(memory usage) 11.4GB > 11.18GB (executor-memory=6GB + memoryOverhead=5.18GB)
尝试
--conf "spark.yarn.executor.memoryOverhead=6144"`
答案 1 :(得分:3)
如您所见,11.2 GB是纱线创建的容器的最大内存。它等于执行程序内存+开销。所以python内存不计算在内。
Exception希望您增加开销,但是您可以在不增加开销内存的情况下增加执行程序内存。多数民众赞成我不知道为什么你需要在一个执行器中需要那么多的记忆,可能是一个笛卡儿或类似的东西需要这么多的记忆。
答案 2 :(得分:1)
两年半之后...我碰巧正在读spark release notes并看到以下内容:
添加spark.executor.pyspark.memory限制
存在此链接的错误:https://issues.apache.org/jira/browse/SPARK-25004
我很早就解决了最初的问题,然后又换了工作,所以我不再有能力尝试这个问题。但是我怀疑这可能是我遇到的确切问题。