我有一个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:上的执行器1丢失(地址已删除):容器因超出内存限制而被yarn杀死。使用了11.2 gb物理内存中的11.4 gb。考虑将spark.yarn.executor.memoryoverhead提升。
我试着把记忆提高到极高的水平,但还是一样的问题。我和:
--conf "spark.python.worker.memory=1200m" \
--conf "spark.yarn.executor.memoryOverhead=5300" \
--conf "spark.executor.memory=6g" \
当然,这就足够了吗?
我想更一般地说,我很难理解python工作者的内存是如何控制/计算在总内存中的。有这方面的文件吗?
我还想了解使用generator函数是否真的会减少内存使用。它将通过python进程来流式传输数据(如我所希望的那样),还是在发送回jvm/spark基础设施之前对所有数据进行缓冲?
3条答案
按热度按时间bjp0bcyl1#
如您所见,11.2GB是由yarn创建的容器的最大内存。它等于执行器内存+开销。所以python内存不算在内。
exception希望您增加开销,但您可以只增加executor内存而不增加overdememory。这就是我所能说的,我不知道为什么你需要那么多的内存在一个执行器,可能是笛卡尔或类似的东西,可以需要这么多的内存。
zi8p0yeb2#
Yarn在它的作用下会杀死执行者
从您的设置来看,它似乎是一个有效的例外。
尝试
zzzyeukh3#
两年半后。。。我碰巧正在阅读spark发行说明,看到了以下内容:
添加spark.executor.pyspark.memory limit
与此链接的错误:https://issues.apache.org/jira/browse/spark-25004
我已经很长一段时间没有解决我原来的问题,然后换了工作,所以我不再有能力尝试这个了。但我怀疑这可能正是我遇到的问题。