这是我的问题。假设我有一个长期运行的PySpark框架。它有数以千计的任务可以并行执行。我在许多不同的主机上开始分配1,000个核心。每项任务都需要一个核心。然后,当这些完成时,主机保持一个核心并且没有活动任务。由于存在大量主机,因此可能发生的情况是,我的核心中越来越大的百分比被分配给没有任何活动任务的执行程序。所以我可以分配1000个核心,但只有100个活动任务。其他900个内核分配给没有活动任务的执行程序。我怎样才能改善这个?有没有办法关闭没有做任何事情的执行者?我目前正在使用PySpark 1.2,因此该版本的功能非常棒,但很高兴听到新版本中的解决方案(或更好的解决方案)。谢谢!
答案 0 :(得分:0)
如果未指定Spark应使用的执行程序数,则只要Spark在其队列中至少有1个待处理任务挂起,Spark就会分配执行程序。您可以使用以下参数设置Spark可以动态分配的执行程序数的上限:spark.dynamicAllocation.maxExecutors
。
换句话说,在启动spark时,请使用:
pyspark --master yarn-client --conf spark.dynamicAllocation.maxExecutors=1000
代替
pyspark --master yarn-client --num-executors=1000
默认情况下,Spark会在60s
非活动后释放执行程序。
注意,如果您.persist()
使用Spark.DataFrame,请确保.unpersist()
否则Spark将不会释放执行程序。