當您的業務量需求不斷波動,並且您對自己的業務有較好的瞭解,建議您開啟Auto Scaling功能並配置相應的伸縮規則,E-MapReduce(簡稱 EMR)能夠根據業務量的變化自動增加或減少Task節點,從而確保順利完成作業並節省成本。本文為您介紹如何配置自訂Auto Scaling策略。
前提條件
使用限制
為避免由於ECS庫存不足造成的Auto Scaling失敗,您可以在新增節點群組時配置多種執行個體規格,最多可以選擇10種ECS執行個體規格作為備選,系統將按照您選擇的順序購買執行個體。每個節點建立時,會從第一個規格開始嘗試,如果該規格庫存不足,則依次嘗試下一個規格,直到建立成功。最終購買的執行個體規格可能隨庫存變化而不同。
僅部署了YARN服務的叢集,支援配置負載伸縮規則。
注意事項
您可以為滿足條件的節點群組添加Auto Scaling規則,當規則引發後,節點群組會按照規則預置的策略自動進行節點群組的擴容或縮容。如果不設定規則,則不會觸發Auto Scaling活動。
系統會根據您選擇的具體執行個體規格,自動匹配出滿足條件的執行個體,並顯示在備選執行個體列表中。您需要選中備選的執行個體,以便叢集按照已選的執行個體規格進行伸縮。
如果您設定了多條Auto Scaling規則,當同時滿足條件時,系統將會按照以下內容觸發和執行:
擴容規則優先於縮容規則。
按時間和按負載規則按照觸發先後執行。
按負載伸縮中根據觸發的指標的時間排序。
按負載伸縮中同一觸發指標按照規則建立的順序觸發。
操作步驟
方式一:為已有叢集建立自訂伸縮規則
進入Auto Scaling頁面。
登入EMR on ECS。
在頂部功能表列處,根據實際情況選擇地區和資源群組。
單擊目的地組群的叢集名稱。
單擊上方的Auto Scaling。
配置伸縮規則。
在Auto Scaling配置頁簽的配置Auto Scaling規則地區,單擊自訂Auto Scaling規則,選擇重新設定,單擊目標節點群組操作列的編輯。
在配置Auto Scaling面板,配置相關參數。
當前節點群組執行個體數限制:用於控制組內節點數,避免Auto Scaling自動運行時導致節點群組內節點數過多或過少。如果需要更改該配置,請單擊修改限制。
最大執行個體數:用於控制當前節點群組的節點數量上限,當到達上限時,不再擴容。
最小執行個體數:用於控制當前節點群組的節點數量下限,當到達下限時,不再縮容。
觸發規則:展示和配置當前節點群組的伸縮規則。
規定時間伸縮
如果叢集計算量在一定的周期記憶體在明顯的波峰和波穀,則您可以設定在每天、每周或每月的固定時間段擴充一定量的Task節點來補充計算能力,這樣在保證作業完成的同時,也可以節省成本。伸縮規則分為擴容規則和縮容規則。
重要為了避免潛在的操作衝突以及確保伸縮操作能夠順利進行,請勿將擴容與縮容規則的執行時間設定為同一時間點。
本樣本以擴容規則為例介紹。
參數
描述
擴容類型
按時間擴容。
規則名稱
在同一個叢集中,伸縮規則名稱(包括擴容規則和縮容規則)不允許重複。
執行頻率
重複執行:您可以選擇每天、每周或每月的某一特定時間點執行一次Auto Scaling動作。
只執行一次:叢集在指定的時間點執行一次Auto Scaling動作。
執行時間
選擇規則執行的時間。
規則有效期間
當執行頻率選擇重複執行時,可設定規則生效的截止時間,超出後則不會觸發伸縮活動。
重試到期時間
Auto Scaling在到達指定時間時可能由於各種原因不能執行,通過設定重試到期時間,系統會在該時間範圍內每隔30秒嘗試執行一次,直到滿足條件時執行伸縮。設定範圍為0~3600秒。
例如,在指定時間段需要進行Auto Scaling動作A,如果有其他Auto Scaling動作B正在執行或正處在冷卻期,則動作A無法執行。在您設定的重試到期時間內,每隔30秒會重試一次,嘗試執行A,一旦條件滿足,叢集會立刻執行Auto Scaling。
單次擴容數
時間規則被觸發時,節點群組每次觸發伸縮活動增加的節點數量。
儘力交付
建議開啟。開啟儘力交付功能後,會按照最大成功數量交付,以維持整體業務的順暢運行。
例如,配置在每天零點定時擴容100台,如果庫存只有90台,未開啟該流程會失敗,開啟以後,會將90台庫存進行交付。
規定負載伸縮
說明僅當建立的叢集部署了YARN服務後,才支援該功能。
如果您無法準確地預估巨量資料計算的波峰和波穀,但對自己的業務模式有較好的瞭解,則可以使用按負載伸縮配置的策略。伸縮規則分為擴容規則和縮容規則,本樣本以擴容規則為例介紹。
參數
描述
擴容類型
按負載擴容。
規則名稱
在同一個叢集中,伸縮規則名稱(包括擴容規則和縮容規則)不允許重複。
負載指標觸發條件
按負載伸縮規則進入觸發狀態時需滿足的條件。您需要選擇一個或多個系統定義的負載指標,選擇多個系統定義的負載指標時,單擊添加指标繼續選擇即可。該部分參數包含以下內容:
負載指標:系統支援的負載指標名稱。E-MapReduceAuto Scaling指標與YARN負載指標的對應關係,請參見E-MapReduceAuto Scaling指標與YARN服務的對應關係。
說明叢集類型不同,系統支援的負載指標也不同,具體請您以控制台實際頁面顯示為準。
統計辦法:即判定負載指標值超出閾值範圍的規則。選定的負載指標在一個統計周期內,按照選定的彙總維度(平均值、最大值和最小值),達到閾值為一次觸發。
多指标关系
支援当所有指标都符合条件时触发和任意一个指标符合条件时触发兩種警示規則的選擇方式。
統計周期
指標統計時間長度,Auto Scaling會根據統計周期收集、匯總和比較資料,粒度越小越易觸發規則,請根據業務需要選擇合理的統計周期。
重複幾次後擴容
根據統計辦法,負載指標值超出閾值後,Auto Scaling會記錄次數,滿足重複次數後才會觸發相應的伸縮規則。
單次擴容數
負載規則被觸發時,節點群組每次觸發伸縮活動增加的節點數量。
儘力交付
開啟以後會按照最大成功數量交付。按負載伸縮受指標觸發影響,是否開啟可根據業務選擇。
冷卻時間
每次Auto Scaling動作開始,到可以再次進行Auto Scaling的時間間隔。在冷卻時間內,即使滿足Auto Scaling條件也不會發生Auto Scaling動作。即忽略本次在冷卻時間內觸發的Auto Scaling動作,直到下一次滿足伸縮條件且不在冷卻時間內再執行。
當節點群組完成伸縮活動並達到預期狀態時,冷卻時間可使後續觸發伸縮活動的負載指標處於穩定點。
生效時間約束
選擇性參數,用於控制按負載伸縮規則的生效時間範圍。預設為全天24小時,設定後僅在設定的時間範圍內觸發伸縮活動。
配置完後,單擊儲存並應用。
當條件滿足時會觸發節點群組的Auto Scaling活動。
方式二:建立叢集時建立自訂伸縮規則
登入EMR on ECS。
在頂部功能表列處,根據實際情況選擇地區和資源群組。
單擊建立叢集,參數詳情請參見建立叢集。
說明您必須在叢集下添加隨用隨付TASK節點群組,才可以配置相應的規則。
配置叢集伸縮。
選擇自訂Auto Scaling規則,單擊目標節點群組操作列的編輯。
在配置Auto Scaling面板,配置相關參數,詳情請參見配置伸縮規則。
配置完後,單擊儲存並應用。
確認訂單,建立叢集。
建立叢集後,當規則滿足時,會觸發節點群組的伸縮活動。
方式三:使用SDK建立自訂伸縮規則
在建立叢集或節點群組時,您可以為節點群組配置自訂的伸縮規則,以實現節點的自動建立和管理。詳情請參見CreateCluster - 建立叢集和CreateNodeGroup - 建立節點群組。您也可以為已有節點群組配置自訂伸縮規則,詳情請參見PutAutoScalingPolicy - 建立自訂Auto Scaling策略。
以下以Java代碼為例,配置了一個按負載的彈性擴容規則。
初始化憑據用戶端時,建議使用更安全的STS方式。更多鑒權訪問方式,請參見管理訪問憑據。
// This file is auto-generated, don't edit it. Thanks.
package com.aliyun.sample;
import com.aliyun.tea.*;
public class Sample {
/**
* <b>description</b> :
* <p>使用AK&SK初始化帳號Client</p>
* @return Client
*
* @throws Exception
*/
public static com.aliyun.emr20210320.Client createClient() throws Exception {
// 工程代碼泄露可能會導致 AccessKey 泄露,並威脅帳號下所有資源的安全性。以下程式碼範例僅供參考。
// 建議使用更安全的 STS 方式
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
// 必填,請確保代碼運行環境設定了環境變數 ALIBABA_CLOUD_ACCESS_KEY_ID。
.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
// 必填,請確保代碼運行環境設定了環境變數 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
// Endpoint 請參考 https://api.aliyun.com/product/Emr
config.endpoint = "emr.eu-central-1.aliyuncs.com";
return new com.aliyun.emr20210320.Client(config);
}
public static void main(String[] args_) throws Exception {
java.util.List<String> args = java.util.Arrays.asList(args_);
com.aliyun.emr20210320.Client client = Sample.createClient();
com.aliyun.emr20210320.models.ScalingConstraints scalingConstraints = new com.aliyun.emr20210320.models.ScalingConstraints()
.setMaxCapacity(10)
.setMinCapacity(0);
com.aliyun.emr20210320.models.TriggerCondition scalingRule0MetricsTriggerTriggerCondition0 = new com.aliyun.emr20210320.models.TriggerCondition()
.setMetricName("yarn_resourcemanager_queue_AvailableVCoresPercentage")
.setStatistics("AVG")
.setComparisonOperator("LE")
.setThreshold(15D);
com.aliyun.emr20210320.models.TriggerCondition scalingRule0MetricsTriggerTriggerCondition1 = new com.aliyun.emr20210320.models.TriggerCondition()
.setMetricName("yarn_resourcemanager_queue_AvailableMBPercentage")
.setStatistics("AVG")
.setComparisonOperator("LE")
.setThreshold(15D);
com.aliyun.emr20210320.models.MetricsTrigger scalingRule0MetricsTrigger = new com.aliyun.emr20210320.models.MetricsTrigger()
.setTimeWindow(300)
.setEvaluationCount(1)
.setCoolDownInterval(300)
.setConditionLogicOperator("Or")
.setConditions(java.util.Arrays.asList(
scalingRule0MetricsTriggerTriggerCondition0,
scalingRule0MetricsTriggerTriggerCondition1
));
com.aliyun.emr20210320.models.ScalingRule scalingRule0 = new com.aliyun.emr20210320.models.ScalingRule()
.setRuleName("default")
.setTriggerType("METRICS_TRIGGER")
.setActivityType("SCALE_OUT")
.setAdjustmentValue(1)
.setMetricsTrigger(scalingRule0MetricsTrigger);
com.aliyun.emr20210320.models.PutAutoScalingPolicyRequest putAutoScalingPolicyRequest = new com.aliyun.emr20210320.models.PutAutoScalingPolicyRequest()
.setRegionId("cn-hangzhou")
.setClusterId("c-xxxx")
.setNodeGroupId("ng-xxx")
.setScalingRules(java.util.Arrays.asList(
scalingRule0
))
.setConstraints(scalingConstraints);
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
// 複製代碼運行請自行列印 API 的傳回值
client.putAutoScalingPolicyWithOptions(putAutoScalingPolicyRequest, runtime);
} catch (TeaException error) {
// 此處僅做列印展示,請謹慎對待異常處理,在工程專案中切勿直接忽略異常。
// 錯誤 message
System.out.println(error.getMessage());
// 診斷地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception exception) {
TeaException error = new TeaException(exception.getMessage(), exception);
// 此處僅做列印展示,請謹慎對待異常處理,在工程專案中切勿直接忽略異常。
// 錯誤 message
System.out.println(error.getMessage());
// 診斷地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
}
}E-MapReduceAuto Scaling指標與YARN服務的對應關係
與隊列相關Auto Scaling指標,指定隊列queue_name參數,預設值為root,支援自訂隊列。
與分區相關Auto Scaling指標,指定分區partition_name參數,不可為空。
E-MapReduceAuto Scaling指標 | 所屬服務 | 說明 |
yarn_resourcemanager_queue_AvailableVCores | YARN | 指定隊列可供分配的虛擬核心數。 |
yarn_resourcemanager_queue_PendingVCores | YARN | 指定隊列待分配的虛擬核心數。 |
yarn_resourcemanager_queue_AllocatedVCores | YARN | 指定隊列已指派的虛擬核心數。 |
yarn_resourcemanager_queue_ReservedVCores | YARN | 指定隊列預留的虛擬核心數。 |
yarn_resourcemanager_queue_AvailableMB | YARN | 指定隊列可供分配的記憶體量。 |
yarn_resourcemanager_queue_PendingMB | YARN | 指定隊列待分配的記憶體量。 |
yarn_resourcemanager_queue_AllocatedMB | YARN | 指定隊列已指派的記憶體量。 |
yarn_resourcemanager_queue_ReservedMB | YARN | 指定隊列預留的記憶體量。 |
yarn_resourcemanager_queue_AppsRunning | YARN | 指定隊列運行中的任務數。 |
yarn_resourcemanager_queue_AppsPending | YARN | 指定隊列掛起的任務數。 |
yarn_resourcemanager_queue_AppsKilled | YARN | 指定隊列終止的任務數。 |
yarn_resourcemanager_queue_AppsFailed | YARN | 指定隊列失敗的任務數。 |
yarn_resourcemanager_queue_AppsCompleted | YARN | 指定隊列完成的任務數。 |
yarn_resourcemanager_queue_AppsSubmitted | YARN | 指定隊列提交的任務數。 |
yarn_resourcemanager_queue_AllocatedContainers | YARN | 指定隊列已指派的容器數。 |
yarn_resourcemanager_queue_PendingContainers | YARN | 指定隊列待分配的容器數。 |
yarn_resourcemanager_queue_ReservedContainers | YARN | 指定隊列預留的容器數。 |
yarn_resourcemanager_queue_AvailableMBPercentage | YARN | 指定隊列可用記憶體資源所佔百分比。 說明 EMR-3.43.0及之後版本、EMR-5.9.0及之後版本支援該指標。 |
yarn_resourcemanager_queue_PendingContainersRatio | YARN | 指定隊列待分配的容器數與已指派的容器數的比率。 說明 EMR-3.43.0及之後版本、EMR-5.9.0及之後版本支援該指標。 |
yarn_resourcemanager_queue_AvailableVCoresPercentage | YARN | 指定隊列可用CPU核心數資源所佔百分比。 說明 EMR-3.43.0及之後版本、EMR-5.9.0及之後版本支援該指標。 |
yarn_cluster_numContainersByPartition | YARN | 指定分區的容器數量,參數partition_name為分區名稱。 說明 EMR-3.44.0及之後版本、EMR-5.10.0及之後版本支援該指標。 |
yarn_cluster_usedMemoryMBByPartition | YARN | 指定分區的記憶體使用量量,參數partition_name為分區名稱。 說明 EMR-3.44.0及之後版本、EMR-5.10.0及之後版本支援該指標。 |
yarn_cluster_availMemoryMBByPartition | YARN | 指定分區的記憶體可用量,參數partition_name為分區名稱。 說明 EMR-3.44.0及之後版本、EMR-5.10.0及之後版本支援該指標。 |
yarn_cluster_usedVirtualCoresByPartition | YARN | 指定分區的CPU核心數使用量,參數partition_name為分區名稱。 說明 EMR-3.44.0及之後版本、EMR-5.10.0及之後版本支援該指標。 |
yarn_cluster_availableVirtualCoresByPartition | YARN | 指定分區的CPU核心數可用量,參數partition_name為分區名稱。 說明 EMR-3.44.0及之後版本、EMR-5.10.0及之後版本支援該指標。 |