Python Spark/Yarn内存使用情况

Joe*_*e K 10 python hadoop hadoop-yarn apache-spark pyspark

我有一个火花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)
Run Code Online (Sandbox Code Playgroud)

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

错误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" \
Run Code Online (Sandbox Code Playgroud)

当然,这足够的记忆总结?

我想更普遍的是,我很难理解蟒蛇工作者的记忆是如何在总体中控制/计算的.有没有这方面的文件?

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

Ron*_*tel 5

纱线杀死执行者

memory usage > (executor-memory + executor.memoryOverhead)
Run Code Online (Sandbox Code Playgroud)

从您的设置看起来它是一个有效的例外.

(memory usage) 11.4GB > 11.18GB (executor-memory=6GB + memoryOverhead=5.18GB)
Run Code Online (Sandbox Code Playgroud)

尝试

--conf "spark.yarn.executor.memoryOverhead=6144"`
Run Code Online (Sandbox Code Playgroud)


hal*_*lil 3

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

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