python spark/yarn内存使用

inb24sb2  于 2021-06-02  发布在  Hadoop
关注(0)|答案(3)|浏览(353)

我有一个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基础设施之前对所有数据进行缓冲?

bjp0bcyl

bjp0bcyl1#

如您所见,11.2GB是由yarn创建的容器的最大内存。它等于执行器内存+开销。所以python内存不算在内。
exception希望您增加开销,但您可以只增加executor内存而不增加overdememory。这就是我所能说的,我不知道为什么你需要那么多的内存在一个执行器,可能是笛卡尔或类似的东西,可以需要这么多的内存。

zi8p0yeb

zi8p0yeb2#

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"`
zzzyeukh

zzzyeukh3#

两年半后。。。我碰巧正在阅读spark发行说明,看到了以下内容:
添加spark.executor.pyspark.memory limit
与此链接的错误:https://issues.apache.org/jira/browse/spark-25004
我已经很长一段时间没有解决我原来的问题,然后换了工作,所以我不再有能力尝试这个了。但我怀疑这可能正是我遇到的问题。

相关问题