【问题标题】:Spark (yarn-client mode) not releasing memory after job/stage finishesSpark(纱线客户端模式)在作业/阶段完成后不释放内存
【发布时间】:2019-02-16 17:42:51
【问题描述】:

我们一直在通过 spark-shell 中的交互式 spark 作业或在 RStudio 中运行 Sparklyr 等来观察这种行为。

假设我在 yarn-client 模式下启动了 spark-shell 并执行了一个操作,该操作触发了作业中的多个阶段并消耗了 x 个内核和 y MB 内存。一旦此作业完成,并且相应的 spark 会话仍处于活动状态,即使该作业已完成,分配的内核和内存也不会释放。 这是正常行为吗?

直到对应的spark session完成,ip:8088/ws/v1/cluster/apps/application_1536663543320_0040/ 一直显示: 是的 X z

我会假设,Yarn 会动态地将这些未使用的资源分配给正在等待资源的其他 Spark 作业。 请澄清我是否在这里遗漏了什么。

【问题讨论】:

  • 你能试试看下面的答案是否有效吗?

标签: apache-spark hadoop-yarn


【解决方案1】:

是的,在 SparkSession 处于活动状态之前会分配资源。为了更好地处理这个问题,您可以使用动态分配。

https://jaceklaskowski.gitbooks.io/mastering-apache-spark/spark-dynamic-allocation.html

【讨论】:

  • 感谢 Tomasz 的回复。我们总是将 spark.dynamicAllocation.enabled 设置为 True,但资源仍然不会从已完成的作业中动态取消分配并分配给另一个需要的作业。
【解决方案2】:

您需要围绕动态分配https://spark.apache.org/docs/latest/configuration.html#dynamic-allocation 进行配置 -

  1. spark.dynamicAllocation.executorIdleTimeout 设置为较小的值,例如10 秒。该参数的默认值为 60s。此配置告诉 spark 仅当它空闲这么长时间时才应该释放执行程序。
  2. 检查spark.dynamicAllocation.initialExecutors/spark.dynamicAllocation.minExecutors。将这些设置为一个小数字——比如 1/2。除非 SparkSession 关闭,否则 Spark 应用程序将永远不会缩小到此数字以下。

一旦你设置了这两个配置,你的应用程序应该在空闲 10 秒后释放额外的执行器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-22
    • 2017-06-24
    • 2014-01-14
    • 1970-01-01
    • 2023-04-08
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多