我们通过spark-shell中的交互式spark作业或在RStudio中运行Sparklyr等来始终观察这种行为。
说,我在yarn-client模式下启动了spark-shell并执行了一个动作,该动作触发了工作的多个阶段,并消耗了x个内核和y MB内存。一旦该作业完成,并且相应的spark会话仍处于活动状态,即使该作业完成,分配的内核和内存也不会释放。 这是正常行为吗?
在相应的spark会话结束之前,ip:8088 / ws / v1 / cluster / apps / application_1536663543320_0040 / 一直显示: ÿ X z
我认为,Yarn会将这些未使用的资源动态分配给其他正在等待资源的Spark作业。 请在这里说明我是否缺少什么。
答案 0 :(得分:0)
是的,资源一直分配到SparkSession处于活动状态。为了更好地处理此问题,您可以使用动态分配。
https://jaceklaskowski.gitbooks.io/mastering-apache-spark/spark-dynamic-allocation.html
答案 1 :(得分:0)
您需要围绕动态分配it is an assignment-
进行配置spark.dynamicAllocation.executorIdleTimeout
设置为较小的值,例如10s。该参数的默认值为60s。此配置告诉spark只有在空闲了这么长时间后才应释放执行程序。spark.dynamicAllocation.initialExecutors
/ spark.dynamicAllocation.minExecutors
。将它们设置为一个较小的数字-例如1/2。除非关闭SparkSession,否则spark应用程序将永远不会缩小到该数字以下。设置了这两个配置后,应用程序应在空闲10秒钟后释放额外的执行程序。