容量調度絕對值配置隊列使用與避坑
在 yarn 中,對于容量調度而言,需要配置不同的隊列,并為隊列分配不同的資源。然而資源的配置是按照集群總資源的百分比來的,那么,如果集群資源進行擴容,隊列的資源也就相應的增加了。在某些場景下, 我們可能希望某些隊列的資源是固定的,不隨集群資源的擴縮容而變更,這就需要給隊列資源配置一個絕對值,在 hadoop3.1.0 版本中,開始引入了這個功能。本文就來聊聊如何給隊列配置絕對值資源,以及一些使用過程中的注意事項。
配置使用
配置絕對值資源的隊列其實很簡單,在原來配置百分比的地方,修改為資源的絕對值即可。例如:
<property>
<name>yarn.scheduler.capacity.root.bigdata.capacity</name>
<value>[vcores=60,memory=614400,yarn.io/gpu=0]</value>
</property>
這樣,配置的隊列就是固定的資源了。
使用注意事項
雖然配置比較簡單,使用方式和原來相比也沒有什么變化,但還是有不少要注意的地方。
1. 根隊列下,隊列可創建的模式
在根隊列("/")下,可以同時創建類型為百分比、絕對值的子隊列。
2. 根隊列下,隊列的容量問題
在根隊列下,如果同時創建了百分比、絕對值方式的隊列,那么對于百分比隊列而言,累加的百分比可以大于 100%,但單個隊列的百分比值不能超過 100%
同樣對于絕對值方式的隊列,所有隊列的資源總和同樣可以大于集群的總資源,但是,如果根隊列下只有百分比的隊列,那么隊列累加的百分比之和還是和之前一樣,必須等于 100,對于絕對值的隊列,也是一樣的,非根隊列下的子隊列,其資源的總和可以大于等于父隊列的資源,但不能超過父隊列的資源。
3. 子隊列的模式
前面說了根隊列下的隊列可以同時創建百分比、絕對值方式的隊列,而在非根隊列下的隊列,其類型就必須與父隊列保持一致,即如果父隊列是百分比的,那么子隊列也只能是百分比;如果父隊列是按絕對值方式配置的,子隊列也只能以絕對值的方式進行配置,否則會報類型不匹配的錯誤,導致隊列刷新失敗或 rm 啟動失敗,例如采用如下配置更新隊列:
<property>
<name>yarn.scheduler.capacity.root.cloudstorage.capacity</name>
<value>50</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.cloudstorage.queues</name>
<value>ceph</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.cloudstorage.ceph.capacity</name>
<value>[vcores=60,memory=614400,yarn.io/gpu=0]</value>
</property>
報錯信息為:
4. 絕對值隊列下創建資源為 0 的子隊列類型問題
動態新增的某個隊列不需要了, 這個時候會將隊列的資源配置為 0,并將隊列的狀態配置為 STOPPED,以停用該隊列。
然而由于在絕對值模式的隊列下,創建的子隊列也只能是以絕對值的方式配置,如果此時將子隊列的值設置為 0 后,刷新隊列會報隊列的類型與父隊列不匹配的錯誤。
即配置方式為 [vcores=0,memory=0,yarn.io/gpu=0] 的隊列,其類型認為是百分比的模式,父隊列如果是絕對值模式的, 那么確實就出現了不匹配的報錯。
該問題實際上是一個 bug,正確的方式是:配置為 0 資源的隊列其類型與父隊列相同。社區有對應的記錄,在未來的 3.4.0 中修復。具體可參考 YARN-10364
5. 通過 yarnClient 獲取隊里有效資源不正確
通過 yarnclient 的 getEffectiveMinCapacity 獲取的值與 UI 界面展示的值不相符,同樣這個也是源碼中的 BUG。賦值的時候搞錯了。
注意,當前這個問題僅在 trunk 分支上修復。
以上這些就是使用過程中常見的需要注意的點,除此之外,還有幾個小的點,使用的場景也有限,這里簡單羅列下,如有需要可詳細參考社區的 jira 單。
(1) 絕對值配置的隊列,maxApplications 的值被覆蓋
https://issues.apache.org/jira/browse/YARN-10396
(2) 第三級隊列資源計算錯誤問題
https://issues.apache.org/jira/browse/YARN-8917
總結
文章就總結到這里了,看完之后是否還記得應該如何給隊列配置絕對值資源,以及使用中有哪些需要注意的地方。此外,是否也還留有一些疑惑的地方,比如 root 隊列下,多個絕對值配置的隊列的總資源超過了集群資源,那么該隊列使用時實際能占用多少資源,具體是如何計算的等等,這就作為下篇文章的內容,我們下次再聊。