在很多集群里,在關閉了Spark的DynamicAllocation的前提下(避免自動申請空閑資源,干擾測試結果),都會觀察到:提交Spark作業時,申請 1 個 driver + n 個 executor 會在Yarn上對應創建 n+1 個 container,但是每個container只有一個vCore,通過--driver-cores
和--executor-cores
設定的vCore數都未奏效。有人會因此錯誤的認為Yarn上的一個vCore對應一個Spark的executor,這是非常錯誤的,正確的關系是:一個Saprk Executor運行在一個Yarn Container里,Executor和Container是一對一的關系。Executor申請的vCore就是Container的vCore,但后半句其實是有條件的,上面描述的就是一種例外。
實際上,上面說的:一個 spark executor / yarn container 只分配一個vCore其實挺常見的,因為這種現象和一個配置項有關,在這個配置項的默認配置下,集群的行為就是這個樣子,所以這種情況出現的概率很大。下面就詳細介紹一下導致這種情況發生的原因和修正方法。
1. 重要結論
在使用Capacity Scheduler的前提下,Yarn有一個配置項:yarn.scheduler.capacity.resource-calculator
,它是用來指定使用哪種方法(策略)計算集群資源的,這將決定資源調度器如何為一個作業分配內存和CPU。該配置的默認值是:DefaultResourceCa