Node Labels是YARN提供的節點資料分割函數,使得YARN在調度時能夠在物理層面上對不同類型的作業進行有效隔離。本文為您介紹如何根據您的業務類型和節點類型建立相應的Node Labels。
背景資訊
YARN提供的隊列(Queue)與節點分區(Node Labels)是資源管理與調度中兩項重要策略。它們各自承擔著不同的角色,並在叢集資源管理中發揮著獨特的作用。
Queue是一種邏輯資源劃分方式,允許將叢集的計算資源按照預先設定的比例分配給不同的使用者組或應用程式。通過這種方式,可以確保即使在共用的叢集環境中,不同團隊或不同類型的工作負載也能夠公平地獲得所需的資源。
Node Labels提供了一種機制,用於標識叢集中的特定節點,並基於這些標籤執行更為細緻的資源分派決策。這對需要利用特定硬體特性(例如GPU或者大記憶體節點)的應用程式尤為重要。
Queue主要關注資源的分配與作業的調度,而Node Labels則著重於節點的分組及作業的物理位置。因此,在實際應用中,Queue與Node Labels能夠有效結合,以實現更靈活且高效的資源管理與作業調度。
使用者可以根據自身的業務需求和叢集狀況,選擇合適的節點分區劃分方式,以便有效管理和調度叢集資源。Node Labels的常見劃分方式可依據業務團隊的業務類型(如資料同步任務、批處理任務、即時處理任務等)以及叢集節點的執行個體類型(如CPU型、記憶體型、GPU計算型等)進行劃分。
前提條件
已建立帶YARN服務的叢集,詳情請參見建立叢集。
叢集YARN的調度器選擇了Capacity Scheduler,目前僅有Capacity Scheduler調度器支援Node Labels的分區調度。
應用樣本
樣本背景
某公司根據業務團隊的資源需求,將叢集隊列劃分為資料倉儲隊列(warehouse)和資料分析隊列(analysis),並將叢集資源分為批處理(batch)和流處理(streaming)兩個分區。其中,資料倉儲團隊將利用60%的批處理資源和70%的流處理資源,而資料分析團隊則將使用30%的批處理資源和20%的流處理資源。此外,未打標籤的資源中,資料倉儲佔比為60%,資料分析隊列的資源佔比為30%,並預留10%的資源供其他需求使用。具體劃分情況請參見下圖。
本樣本將採用隊列與標籤相結合的方式,以實現靈活的資源管理,並對離線任務進行物理隔離,從而確保不影響其他任務的效能與穩定性。以下步驟均在叢集EMR-5.16.0版本的資料湖叢集類型下實施,其它叢集的操作步驟亦具有相似性。
步驟一:編輯資源隊列
登入EMR on ECS控制台,單擊目的地組群操作列表下叢集服務,在這個頁面,找到YARN服務並單擊進入。
在YARN服務頁面,單擊編輯資源隊列,在這個頁面單擊管理隊列。
在管理子隊列頁面,新增資料倉儲團隊warehouse隊列和資料分析團隊analysis隊列。
warehouse隊列容量佔比為60%,analysis隊列容量佔比為30%,餘下10%給default隊列,狀態都選擇為開啟。

配置完之後,頁面如下圖。

單擊待生效,在待生效配置頁面單擊refresh_queues,完成隊列配置。

步驟二:建立節點分區
單擊管理分區,在這個頁面單擊新增分區,新增streaming分區。
在新增分區頁面,填寫分區名稱,選擇分區類型,選擇需要關聯節點群組。

參數
說明
分區名稱
當前樣本分區名稱是streaming。
分區類型
當前樣本選擇exclusive,表示只允許請求和該分區匹配的容器調度到該分區的節點上。
關聯節點群組
當前樣本streaming分區關聯emr-task-3。當前叢集emr-task-3節點執行個體類型是記憶體型,適合運行需要儲存大量中間資料、低延遲的即時任務。關聯節點群組的分配需要結合各自業務的特點與節點執行個體類型進行合理分配。
重複上述步驟完成batch分區新增,最終如下圖所示。

新增完分區之後,單擊待生效,在待生效配置頁面,單擊refresh_labels,完成節點分區配置。

配置生效之後,可以看到每個分區下的資源總量。

步驟三:啟用分區和隊列關聯管理
在編輯資源隊列頁面,依次選擇batch和streaming分區,並單擊啟用分區和隊列關聯管理。
啟用分區和隊列關聯管理對話方塊,配置各分區下的隊列容量佔比。
batch分區analysis隊列容量佔比為30%,warehouse隊列容量佔比為60%, default隊列容量佔比為10%。
streaming分區analysis隊列容量佔比為20%,warehouse隊列容量佔比為70%, default隊列容量佔比為10%。
說明在本樣本中,所有隊列均具備在各分區啟動並執行許可權。在實際配置中,您可以將特定分區下某隊列的容量佔比設定為0,以確保該分區僅能運行由指定隊列提交的任務。
配置完啟用分區和隊列關聯管理後,單擊待生效,在待生效配置頁面,單擊refresh_queues,完成啟用分區和隊列關聯管理。
在YARN的WEB UI頁面上檢查節點分區是否已生效。
Node Labels頁面

Scheduler頁面

步驟四:提交任務到指定分區
您已經完成叢集隊列和標籤的設定,現在可以提交任務到指定隊列和指定節點運行了。
請登入到叢集的master節點,進入Spark的安裝目錄,例如/opt/apps/SPARK3/spark-3.3.1-hadoop3.2-1.1.1。
cd /opt/apps/SPARK3/spark-3.3.1-hadoop3.2-1.1.1在實際業務中,您需要上傳所需任務的JAR包以提交Spark任務。本測試案例展示了如何使用spark-submit提交任務。
./bin/spark-submit --class org.apache.spark.examples.SparkLR --master yarn --deploy-mode cluster --driver-memory 1g --executor-memory 2g --conf spark.yarn.am.nodeLabelExpression=batch --conf spark.yarn.executor.nodeLabelExpression=batch --queue=warehouse examples/jars/spark-examples_2.12-3.3.1.jar參數
說明
class
應用程式的主類:org.apache.spark.examples.SparkLR。
master
提交任務的執行位置:yarn。
deploy-mode
設定driver啟動的位置:cluster。
driver-memory
Driver記憶體:1g。
executor-memory
每個 executor 的記憶體:2g。
spark.yarn.am.nodeLabelExpression
應用程式主節點運行於該標籤上:batch。
spark.yarn.executor.nodeLabelExpression
執行器運行於該節點分區上:batch。
queue
提交作業到特定的YARN隊列:warehouse。
說明如果您提交任務僅指定隊列,未指定分區,任務將提交到指定隊列的預設分區。隊列的預設分區您可以在編輯資源隊列頁面,編輯您想修改隊列的預設分區。
在YARN叢集的WEB UI頁面進行驗證時,可以觀察到SparkLR任務已成功提交至YARN的warehouse隊列,並且被分配至batch分區進行執行。

通過對YARN的隊列和節點分區進行配置,可以實現使用者特定業務在資源方面的邏輯與物理隔離,從而有效避免業務之間的相互幹擾,確保特定業務的效能與穩定性。
常見問題
在使用spark-submit提交Spark任務時,發現該任務未能在指定的分區上運行。
檢查提交任務的命令是否已添加spark.yarn.executor.nodeLabelExpression參數。
請確認管理分區與編輯資源隊列的設定是否生效。
在使用spark-submit提交Spark任務時,發現該任務的狀態始終顯示為ACCEPTED。
請確認該任務提交的隊列上是否存在可用資源。如果未發現可用資源,請耐心等待其他任務完成並釋放資源後再進行提交。
如果該隊列仍有可用資源,在YARN的WEB UI頁面中,單擊相應的任務ID以進入任務詳情頁面,查看Diagnostics描述,您將看到提示:“Queue's AM resource limit exceeded”。這表明隊列雖然具備資源,但AM資源不足。隊列的資源將被分配給AM和EXECUTOR,其中AM資源用於提交主程式,而留給EXECUTOR的資源則用於任務處理。因此,有必要對隊列資源的分配比例進行調整,適當提高AM資源的比例,以確保Spark任務能夠順利提交。

AM資源比例的調整可以在YARN服務的配置頁面找到capacity_scheduler.xml檔案,通過修改yarn.scheduler.capacity.maximum-am-resource-percent配置項的值來實現,例如將其從0.25調整至0.5。

說明yarn.scheduler.capacity.maximum-am-resource-percent隊列預設的AM可用比例應根據具體業務情境進行合理調整。例如,在叢集中存在大量處理小資料量任務的情況下,可以適當提高AM的可用比例。
相關文檔
YARN調度相關原理,詳情參見YARN調度器。
YARN節點分區相關原理,詳情參見Node Labels特性使用。