View a markdown version of this page

管理虛擬叢集 - Amazon EMR

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

管理虛擬叢集

虛擬叢集是 Amazon EMR 註冊的 Kubernetes 命名空間。您可以建立、描述、列出和刪除虛擬叢集。它們不會耗用系統中的任何其他資源。單一虛擬叢集映射至單一 Kubernetes 命名空間。鑑於此關係,您可以使用與建立 Kubernetes 命名空間模型相同的方式來建立虛擬叢集的模型,以符合您的需求。請參閱 Kubernetes 概念概觀文件中的可能使用案例。

若要使用 Amazon EKS 叢集上的 Kubernetes 命名空間註冊 Amazon EMR,您需要 EKS 叢集的名稱,以及為執行工作負載而設定的命名空間。Amazon EMR 中的這些已註冊叢集稱為虛擬叢集,因為它們不會管理實體運算或儲存,而是指向在其中排程工作負載的 Kubernetes 命名空間。

注意

在建立虛擬叢集之前,必須先完成 設定 Amazon EMR on EKS 中的步驟 1-8。

建立虛擬叢集

透過使用 EKS 叢集上的命名空間註冊 Amazon EMR,執行下列命令來建立虛擬叢集。使用您為虛擬叢集提供的名稱取代 virtual_cluster_name。將 eks_cluster_name 取代為 EKS 叢集的名稱。將 namespace_name 取代為您要註冊 Amazon EMR 的命名空間。

aws emr-containers create-virtual-cluster \ --name virtual_cluster_name \ --container-provider '{ "id": "eks_cluster_name", "type": "EKS", "info": { "eksInfo": { "namespace": "namespace_name" } } }'

或者,可以建立包含虛擬叢集所需參數的 JSON 檔案,如下列範例所示。

{ "name": "virtual_cluster_name", "containerProvider": { "type": "EKS", "id": "eks_cluster_name", "info": { "eksInfo": { "namespace": "namespace_name" } } } }

然後使用 JSON 檔案的路徑來執行下列 create-virtual-cluster 命令。

aws emr-containers create-virtual-cluster \ --cli-input-json file://./create-virtual-cluster-request.json
注意

若要驗證虛擬叢集是否成功建立,請檢視虛擬叢集的狀態,方法是執行 list-virtual-clusters 命令或前往 Amazon EMR 主控台中的虛擬叢集頁面。

列出虛擬叢集

執行以下命令以檢視虛擬叢集狀態。

aws emr-containers list-virtual-clusters

描述虛擬叢集

執行下列命令,以取得有關虛擬叢集的詳細資訊,例如命名空間、狀態和註冊日期。將 123456 取代為虛擬叢集 ID。

aws emr-containers describe-virtual-cluster --id 123456

刪除虛擬叢集

執行下列命令以刪除虛擬叢集。將 123456 取代為虛擬叢集 ID。

aws emr-containers delete-virtual-cluster --id 123456

虛擬叢集狀態

下表描述四個可能的虛擬叢集狀態。

State 說明

RUNNING

虛擬叢集處於 RUNNING 狀態。

TERMINATING

正在請求終止虛擬叢集。

TERMINATED

請求的終止已完成。

ARRESTED

請求的終止失敗,因為許可不足。

虛擬叢集的並行任務限制

您可以在 Amazon EMR on EKS 虛擬叢集上設定並行任務限制,以控制同時執行的任務數量,以及佇列中可等待的任務數量。您可以獨立設定並行限制 (maxConcurrentJobRuns) 和佇列深度 (maxInQueueJobRuns),以便對執行中的任務執行、排入佇列的任務執行或兩者設定上限。當您設定這些限制時,StartJobRunAPI 會在虛擬叢集層級提供背壓。任務在 SUBMITTEDPENDING 狀態的佇列中執行超過執行中限制等待,而不是立即啟動,且佇列已滿時, 會StartJobRun拒絕進一步提交。例如,如果您將虛擬叢集設定為允許 500 個並行任務執行和 100 個排入佇列任務執行,則會拒絕第 101 個排入佇列的提交,而且您可以在相同 EKS 叢集上的其他虛擬叢集重新平衡該工作負載或新增容量。當您未設定並行限制且佇列深度持續增加時,讓任務執行在啟動之前保持在 SUBMITTEDPENDING 狀態更久,它可以發出訊號,指出基礎 EKS 叢集在運算資源上執行不足,且無法快速排程新的 Pod。在這種情況下,請將工作負載路由到另一個叢集或新增容量。

並行任務限制會在 Kubernetes 排程器和 Kubernetes 網站上的 ResourceQuota 功能前面新增控制層。由於它們會在 強制執行StartJobRun,因此在建立任何 Pod 之前,API 會排入佇列或拒絕多餘的負載,在任務到達之前保護基礎叢集。Kubernetes 仍會強制執行下方的實際 CPU 和記憶體上限。

並行任務限制的主要優點

  • 防止雜訊鄰近過載 — 限制每個虛擬叢集的執行中和已排入佇列任務執行的數量,讓單一虛擬叢集無法將共用的 EKS 叢集統一,並導致其他虛擬叢集的雜訊鄰近排程失敗。

  • 啟用流量調整 — 當虛擬叢集的佇列已滿時傳回立即拒絕,以便您可以將提交重新導向至其他虛擬叢集,而不是壓倒單一虛擬叢集。

  • 提供可見性 — 每 5 分鐘發出AWS/EMRContainers命名空間中的per-virtual-clusterJobsRunningJobsInQueue CloudWatch 指標,以用於作用中和佇列中的任務執行計數,這為您提供用於排程的運作狀態訊號。

並行任務限制入門

您可以使用虛擬叢集上的 schedulerConfiguration 欄位設定並行任務限制。此欄位接受兩個參數:

maxConcurrentJobRuns

隨時可處於 RUNNING 狀態的任務執行數量上限。

maxInQueueJobRuns

可隨時處於 PENDINGSUBMITTED 狀態 (佇列深度) 的任務執行數量上限。

AWS CLI

若要在建立虛擬叢集時設定限制,請在請求schedulerConfiguration中指定 。

aws emr-containers create-virtual-cluster \ --name my-virtual-cluster \ --container-provider '{ ... }' \ --scheduler-configuration '{ "maxConcurrentJobRuns": 500, "maxInQueueJobRuns": 100 }'

若要變更現有虛擬叢集的限制,請使用 update-virtual-cluster命令。

aws emr-containers update-virtual-cluster \ --id virtual-cluster-id \ --scheduler-configuration '{ "maxConcurrentJobRuns": 500, "maxInQueueJobRuns": 100 }'

若要從虛擬叢集移除限制,請傳遞空的 schedulerConfiguration。這會清除組態,因此不會套用任何限制,而虛擬叢集會回到預設 (無限制) 行為。請注意,schedulerConfiguration從請求中省略 會讓現有的限制保持不變 — 您必須傳遞空物件才能清除它們。

aws emr-containers update-virtual-cluster \ --id virtual-cluster-id \ --scheduler-configuration '{}'

若要檢視目前的限制和即時任務計數,請使用 describe-virtual-cluster命令。回應包含您的 schedulerConfiguration和具有目前 activeJobRunCount和 的 SchedulerStatus 物件inQueueJobRunCount

注意

當您將任務執行提交至佇列已滿的虛擬叢集時, 會StartJobRun傳回 ValidationException

選擇 maxConcurrentJobRuns 和 maxInQueueJobRuns 的值

正確的限制取決於三件事:Amazon EKS 叢集一次可以執行多少工作量、提交的爆量程度,以及您希望虛擬叢集在已滿時如何運作。使用以下指引來挑選起點,然後從即時計數器進行精簡。

設定 maxConcurrentJobRuns (執行中的插槽)

maxConcurrentJobRuns 是以計數為基礎的任務精細性護欄。此處的粗略估算可以保護基礎 Amazon EKS 叢集免於因載入而降級,並可以改善可用性。

  • 從容量除以每個工作佔用量開始。以每個任務請求 (驅動程式、執行器和記憶體額外負荷) 為基礎,並鎖定大約 70–80% 的命名空間容量,為驅動程式額外負荷、節點擴展和爆量留出空間。

  • 限制每個任務的大小 (T-shirt 大小)。使用 綁定每個任務spark.dynamicAllocation.maxExecutors並標準化幾個大小,例如,小型 (20 個執行器)、中型 (100) 和大型 (約 500),以便將上限貼圖可預測maxConcurrentJobRuns地乘以容量,而不是針對變數平均值過度佈建或佈建不足。為了取得最乾淨的數學,請將每個大小類別路由到自己的虛擬叢集。

  • 從即時計數器調校。當您在 AWS/EMRContainers 命名空間中監看 activeJobRunCountJobsRunning 指標時,請開始保守並逐步提高值。

設定 maxInQueueJobRuns (佇列深度)

maxInQueueJobRuns 控制虛擬叢集開始拒絕提交之前接受的待處理項目數量。它是高載吸收緩衝區。請考慮下列因素。

  • 爆量設定檔 — 調整佇列大小以吸收您預期高於執行速率的提交爆量。如果排程管道一次觸發許多任務,則更深層的佇列可防止假性拒絕。以預期的爆量大小為基礎,而不是以 的固定倍數為基礎maxConcurrentJobRuns,並根據接下來的耗盡時間限制進行驗證。

  • 可接受的等待時間 — 佇列任務會等待執行中的槽釋放。完整佇列後方的任務會等待大約佇列深度除以完成輸送量。例如,如果任務以每分鐘 N 完成,且佇列保留 Q,則尾端會等待大約 Q 除以 N 分鐘。將此保留在您的 SLA 中。由於緩衝任務會在 30 分鐘後失敗,如果沒有空出的槽,請保持maxInQueueJobRuns足夠小,讓完整佇列在 30 分鐘內以穩定完成率順利耗盡。否則,排入佇列的任務會逾時。

  • 緩衝比較的背壓 — 較深層的佇列可平滑爆增,但會延遲您用於流量調整的佇列完全拒絕,並增加尾部延遲。較淺的佇列會快速失敗,為用戶端提供可採取動作的早期訊號,以重試或路由其他位置。根據您是否偏好緩衝載入或離開進行選擇,並將其重新導向。

  • 用戶端重試行為 — 當佇列已滿時, StartJobRun會傳回 ValidationException。請確定您的提交者處理此例外狀況:使用退避重試,或將工作負載路由到另一個虛擬叢集。設定深度,讓拒絕只在真正過載期間發生,而不是在例行操作期間發生。

並行任務限制的考量事項

  • 預設不會套用任何限制。除非您明確設定 ,否則現有的虛擬叢集和工作負載不會受到影響schedulerConfiguration

  • 由於計數器會跨分散式系統進行維護,因此有時您可能會預期與真實值有小的暫時性差異。內部對帳可修正任何偏離。