針對執行個體群組,搭配使用自動擴展與自訂政策 - Amazon EMR

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

針對執行個體群組,搭配使用自動擴展與自訂政策

使用 Amazon EMR 4.0 及更新版本中的自訂政策自動擴展,可讓您根據您在擴展政策中指定的指 CloudWatch 標和其他參數,以程式設計方式在核心節點和任務節點中擴展和擴展。自動擴展和自訂政策,可搭配執行個體群組設定,但在使用執行個體機群時不能搭配使用。如需執行個體群組和執行個體機群的詳細資訊,請參閱 使用執行個體機群或統一執行個體群組建立叢集

注意

若要在 Amazon EMR 中搭配使用自動擴展與自訂政策功能,必須在建立叢集時將 VisibleToAllUsers 參數設定為 true。如需詳細資訊,請參閱SetVisibleToAll使用者

擴展政策屬於執行個體群組設定的一部分。您可以在初次設定執行個體群組時指定政策,或是修改既有叢集中的執行個體群組,即使執行個體群組處於使用中的狀態也無妨。除了主要執行個體群組外,叢集中的每個執行個體群組均擁有自己的擴展政策,包含橫向擴展和縮減規則。橫向擴充和縮減的規則可分開設定,每項規則均有不同的參數。

您可以使用 AWS Management Console、或 Amazon EMR API 來設定擴展政策。 AWS CLI使用 AWS CLI 或 Amazon EMR API 時,您可以使用 JSON 格式指定擴展政策。此外,使用 AWS CLI 或 Amazon EMR API 時,您可以指定自訂指 CloudWatch 標。使用 AWS Management Console時無法選取自訂指標。初次使用主控台建立擴展政策時,系統會預先設定好多數應用程式適用的預設政策,以協助您開始使用。這些預設規則均可刪除或修改。

雖然自動調整可讓您調整 EMR 叢集容量 on-the-fly,但您仍應該考慮基準工作負載需求,並規劃節點和執行個體群組組態。如需詳細資訊,請參閱叢集組態指導方針

注意

對於大多數的工作負載而言,最好橫向縮減和橫向擴充兩方規則均要設定,以達到最佳的資源使用效果。若設定規則時少了其中一項,即代表必須在擴展活動後再手動重新調整執行個體的數量。換言之,如此設定的是「單向」的自動橫向擴展或縮減政策,且需手動重新設定。

建立 IAM 角色進行自動擴展

Amazon EMR 中的自動縮減需要具有許可的 IAM 角色,方可在觸發擴展活動時新增和終止執行個體。預設角色 EMR_AutoScaling_DefaultRole 已設定好合適的角色政策和信任政策,可用於此目的。當您第一次使用擴展政策建立叢集時 AWS Management Console,Amazon EMR 會建立預設角色,並附加許可的預設受管政策。AmazonElasticMapReduceforAutoScalingRole

使用自動擴展政策建立叢集時 AWS CLI,必須先確保預設 IAM 角色存在,或者您擁有自訂 IAM 角色且附加了提供適當許可的政策。若要建立預設角色,可在建立叢集前先執行 create-default-roles 命令。也可以在建立叢集時指定 --auto-scaling-role EMR_AutoScaling_DefaultRole 選項。或者可以建議自訂的自動調整規模角色,再於建立叢集時指定該角色,例如 --auto-scaling-role MyEMRAutoScalingRole。若您為 Amazon EMR 建立自訂自動擴展角色,建議您根據受管政策為自訂角色建立基本許可政策。如需詳細資訊,請參閱 將 Amazon EMR 許可的 IAM 服務角色設定為 AWS 服務和資源

了解自動擴展規則

當橫向擴展規則觸發執行個體群組的擴展活動時,會根據您的規則,將 Amazon EC2 執行個體新增至執行個體群組。Amazon EC2 執行個體進入 InService 狀態後,Apache Spark、Apache Hive 和 Presto 這類應用程式即可使用新節點。您也可以設定橫向縮減規則,用於終止執行個體和移除節點。如需有關可自動擴展的 Amazon EC2 執行個體的生命週期詳細資訊,請參閱《Amazon EC2 Auto Scaling 使用者指南》中的 Auto Scaling 生命週期

可以設定叢集終止 Amazon EC2 執行個體的方式。可選擇要在 Amazon EC2 執行個體每小時計價的範圍內終止執行個體,還是在任務完成時再終止。此設定會套用至自動調整規模和手動重新調整兩邊的操作上。如需此組態的詳細資訊,請參閱「叢集縮減規模」。

以下是政策中每條規則用於決定自動調整規模行為的參數。

注意

這裡列出的參數是基 AWS Management Console 於 Amazon EMR 的。當您使用 AWS CLI 或 Amazon EMR API 時,可以使用其他進階組態選項。如需進階選項的詳細資訊,請參閱 Amazon EMR API 參考SimpleScalingPolicyConfiguration中的。

  • 執行個體上限與執行個體下限。執行個體上限限制可指定執行個體群組中存在的 Amazon EC2 執行個體的最大數量,並且會套用至所有橫向擴展規則。同樣地,執行個體下限限制可指定 Amazon EC2 執行個體的最小數量,並可套用至所有縮減規則。

  • Rule name (規則名稱),在政策內必須是唯一的。

  • scaling adjustment (規模調整) 會決定受到規則觸發的擴展活動所要新增 (向外擴展規則) 或終止 (向內擴展規則) 的 EC2 執行個體數量。

  • CloudWatch 標,監視警報狀況。

  • 比較運算子,用來比較CloudWatch 測量結果與「臨界值」值,以及判斷觸發條件。

  • 評估期間 (以五分鐘為增量),在觸發調整活動之前, CloudWatch 量度必須處於觸發條件中。

  • Cooldown period (冷卻時間) 會決定在某條規則觸發擴展活動後,需經過多久才可開始下一次的觸發活動,不論活動是由哪一條規則觸發。當執行個體群組完成擴展活動並達到規模後的狀態時,冷卻時間會為可能觸發後續擴展活動穩定的 CloudWatch 指標提供機會。如需詳細資訊,請參閱《Amazon EC2 Auto Scaling 使用者指南》中的 Auto Scaling 冷卻

    AWS Management Console Amazon EMR 的自動擴展規則參數。

考量與限制

  • Amazon CloudWatch 指標對於 Amazon EMR 自動擴展操作至關重要。我們建議您密切監控 Amazon CloudWatch 指標,以確保資料不會遺失。如需如何設定 Amazon CloudWatch 警示以偵測遺失指標的詳細資訊,請參閱使用 Amazon CloudWatch 警示

  • EBS 磁碟區過度使用可能會導致受管擴展問題。建議密切監控 EBS 磁碟區的使用情況,以確保 EBS 磁碟區使用率低於 90%。如需有關指定其他 EBS 磁碟區的資訊,請參閱執行個體儲存體

  • Amazon EMR 5.18 至 5.28 版中的自訂政策自動擴展可能會因 Amazon 指標中的資料間歇性遺失而導致擴展失敗。 CloudWatch建議使用 Amazon EMR 最新版本來改善自動擴展。如果需要使用 5.18 到 5.28 之間的 Amazon EMR 版本,也可以聯絡 AWS Support 以取得修補程式。

使用 AWS Management Console 來設定自動調整比例

當您建立叢集時,可使用進階叢集設定選項來設定執行個體群組的擴展政策。您也可以在既有叢集的 Hardware (硬體) 設定中修改執行個體群組,藉此建立或修改服務中的執行個體群組的擴展政策。

注意

新的 Amazon EMR 主控台 (https://console.aws.amazon.com/emr) 使用受管擴展,而非自動擴展。若要使用自動擴展,請確定已登入舊主控台,網址為 https://console.aws.amazon.com/elasticmapreduce

  1. 導覽至新的 Amazon EMR 主控台,然後從側邊導覽選取切換至舊主控台。如需有關切換至舊主控台時預期情況的詳細資訊,請參閱使用舊主控台

  2. 若您是要建立叢集,請在 Amazon EMR 主控台中選取建立叢集,再選取前往進階選項,選擇步驟 1:軟體和步驟的選項,然後前往步驟 2:硬體組態

    - 或 -

    若您要修改執行中叢集內的執行個體群組,請在叢集清單中選取您的叢集,再展開 Hardware (硬體) 區段。

  3. 叢集擴展和佈建選項區段中,選取啟用叢集擴展。然後選取 Create a custom automatic scaling policy (建立自訂自動擴展政策)

    Custom automatic scaling policies (自訂自動擴展政策) 表格中,按一下出現在所要設定執行個體群組資料列中的鉛筆圖示。「Auto Scaling 規則」畫面開啟。

  4. 請輸入您希望執行個體群組在向外擴展完畢後的 Maximum instances (執行個體上限),以及在向內擴展後的 Minimum instances (執行個體下限)

  5. 請按一下鉛筆圖示以編輯規則參數,按一下 X 可從政策中移除該條規則,按一下 Add rule (新增規則) 則可增加更多規則。

  6. 按本主題之前的說明,選擇規則參數。如需 Amazon EMR 可用 CloudWatch 指標的說明,請參閱 Amazon CloudWatch 使用者指南中的 Amazon EMR 指標和維度。

使用 AWS CLI 來設定自動調整比例

您可以在建立叢集和建立執行個體群組時,使用 Amazon EMR 的 AWS CLI 命令來設定自動擴展。可使用速記語法來指定相關命令中內嵌的 JSON 組態,或是以含有組態 JSON 的檔案做為參照。您也可以將自動調整規模的政策套用到既有的執行個體群組上,並移除先前套用的自動調整規模政策。此外還能從執行中的叢集上擷取調整規模政策組態的詳細資訊。

重要

建立具有自動擴展政策的叢集時,必須使用 --auto-scaling-role MyAutoScalingRole 命令來指定自動擴展所用的 IAM 角色。預設角色為 EMR_AutoScaling_DefaultRole,可由 create-default-roles 命令建立。該角色只能在建立叢集時新增,且無法新增至既有的叢集。

如需設定自動擴展政策時可用參數的詳細說明,請參閱 Amazon EMR API 參考PutAutoScalingPolicy中的。

使用套用至執行個體群組的自動擴展政策來建立叢集

也可以在 --instance-groups 命令的 aws emr create-cluster 選項中指定自動調整規模的設定。以下範例所說明的建立叢集命令中,是以內嵌方式提供核心執行個體群組的自動調整規模政策。此命令會建立相當於預設向外擴充政策的擴展組態,該規模設定會在您使用 AWS Management Console for Amazon EMR 建立自動擴展政策時顯示。為了簡潔之故,不會顯示縮減政策。不建議建立不含縮減規則的橫向擴展規則。

aws emr create-cluster --release-label emr-5.2.0 --service-role EMR_DefaultRole --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole --auto-scaling-role EMR_AutoScaling_DefaultRole --instance-groups Name=MyMasterIG,InstanceGroupType=MASTER,InstanceType=m5.xlarge,InstanceCount=1 'Name=MyCoreIG,InstanceGroupType=CORE,InstanceType=m5.xlarge,InstanceCount=2,AutoScalingPolicy={Constraints={MinCapacity=2,MaxCapacity=10},Rules=[{Name=Default-scale-out,Description=Replicates the default scale-out rule in the console.,Action={SimpleScalingPolicyConfiguration={AdjustmentType=CHANGE_IN_CAPACITY,ScalingAdjustment=1,CoolDown=300}},Trigger={CloudWatchAlarmDefinition={ComparisonOperator=LESS_THAN,EvaluationPeriods=1,MetricName=YARNMemoryAvailablePercentage,Namespace=AWS/ElasticMapReduce,Period=300,Statistic=AVERAGE,Threshold=15,Unit=PERCENT,Dimensions=[{Key=JobFlowId,Value="${emr.clusterId}"}]}}}]}'

以下命令說明如何使用命令列提供自動擴展政策定義,作為執行個體群組組態檔案 (名稱為 instancegroupconfig.json) 的一部分。

aws emr create-cluster --release-label emr-5.2.0 --service-role EMR_DefaultRole --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole --instance-groups file://your/path/to/instancegroupconfig.json --auto-scaling-role EMR_AutoScaling_DefaultRole

組態檔案的內容如下所示:

[ { "InstanceCount": 1, "Name": "MyMasterIG", "InstanceGroupType": "MASTER", "InstanceType": "m5.xlarge" }, { "InstanceCount": 2, "Name": "MyCoreIG", "InstanceGroupType": "CORE", "InstanceType": "m5.xlarge", "AutoScalingPolicy": { "Constraints": { "MinCapacity": 2, "MaxCapacity": 10 }, "Rules": [ { "Name": "Default-scale-out", "Description": "Replicates the default scale-out rule in the console for YARN memory.", "Action":{ "SimpleScalingPolicyConfiguration":{ "AdjustmentType": "CHANGE_IN_CAPACITY", "ScalingAdjustment": 1, "CoolDown": 300 } }, "Trigger":{ "CloudWatchAlarmDefinition":{ "ComparisonOperator": "LESS_THAN", "EvaluationPeriods": 1, "MetricName": "YARNMemoryAvailablePercentage", "Namespace": "AWS/ElasticMapReduce", "Period": 300, "Threshold": 15, "Statistic": "AVERAGE", "Unit": "PERCENT", "Dimensions":[ { "Key" : "JobFlowId", "Value" : "${emr.clusterId}" } ] } } } ] } } ]

將含有自動擴展政策的執行個體群組新增至叢集

可以使用 --instance-groups 選項搭配 add-instance-groups 命令來指定擴展政策組態,方式與使用 create-cluster 時相同。以下範例參考的是 JSON 檔案 instancegroupconfig.json,搭配執行個體群組的組態。

aws emr add-instance-groups --cluster-id j-1EKZ3TYEVF1S2 --instance-groups file://your/path/to/instancegroupconfig.json

將自動擴展政策套用到既有的執行個體群組上,或修改所套用的政策

請使用 aws emr put-auto-scaling-policy 指定將自動調整規模政策套用到既有的執行個體群組上。該執行個體群組必須屬於某個使用自動擴展 IAM 角色的叢集。以下範例參考的是 JSON 檔案 autoscaleconfig.json,該檔案指定了自動調整規模政策的組態。

aws emr put-auto-scaling-policy --cluster-id j-1EKZ3TYEVF1S2 --instance-group-id ig-3PLUZBA6WLS07 --auto-scaling-policy file://your/path/to/autoscaleconfig.json

autoscaleconfig.json 檔案的內容所定義的橫向擴展規則與上個範例相同,如下所示。

{ "Constraints": { "MaxCapacity": 10, "MinCapacity": 2 }, "Rules": [{ "Action": { "SimpleScalingPolicyConfiguration": { "AdjustmentType": "CHANGE_IN_CAPACITY", "CoolDown": 300, "ScalingAdjustment": 1 } }, "Description": "Replicates the default scale-out rule in the console for YARN memory", "Name": "Default-scale-out", "Trigger": { "CloudWatchAlarmDefinition": { "ComparisonOperator": "LESS_THAN", "Dimensions": [{ "Key": "JobFlowID", "Value": "${emr.clusterID}" }], "EvaluationPeriods": 1, "MetricName": "YARNMemoryAvailablePercentage", "Namespace": "AWS/ElasticMapReduce", "Period": 300, "Statistic": "AVERAGE", "Threshold": 15, "Unit": "PERCENT" } } }] }

從執行個體群組中移除自動擴展政策

aws emr remove-auto-scaling-policy --cluster-id j-1EKZ3TYEVF1S2 --instance-group-id ig-3PLUZBA6WLS07

擷取自動擴展政策組態

describe-cluster令會擷取 InstanceGroup 區塊中的原則組態。舉例而言,以下命令會擷取叢集 ID 為 j-1CWOHP4PI30VJ 的叢集的組態。

aws emr describe-cluster --cluster-id j-1CWOHP4PI30VJ

該命令會產生以下的輸出範例。

{ "Cluster": { "Configurations": [], "Id": "j-1CWOHP4PI30VJ", "NormalizedInstanceHours": 48, "Name": "Auto Scaling Cluster", "ReleaseLabel": "emr-5.2.0", "ServiceRole": "EMR_DefaultRole", "AutoTerminate": false, "TerminationProtected": true, "MasterPublicDnsName": "ec2-54-167-31-38.compute-1.amazonaws.com", "LogUri": "s3n://aws-logs-232939870606-us-east-1/elasticmapreduce/", "Ec2InstanceAttributes": { "Ec2KeyName": "performance", "AdditionalMasterSecurityGroups": [], "AdditionalSlaveSecurityGroups": [], "EmrManagedSlaveSecurityGroup": "sg-09fc9362", "Ec2AvailabilityZone": "us-east-1d", "EmrManagedMasterSecurityGroup": "sg-0bfc9360", "IamInstanceProfile": "EMR_EC2_DefaultRole" }, "Applications": [ { "Name": "Hadoop", "Version": "2.7.3" } ], "InstanceGroups": [ { "AutoScalingPolicy": { "Status": { "State": "ATTACHED", "StateChangeReason": { "Message": "" } }, "Constraints": { "MaxCapacity": 10, "MinCapacity": 2 }, "Rules": [ { "Name": "Default-scale-out", "Trigger": { "CloudWatchAlarmDefinition": { "MetricName": "YARNMemoryAvailablePercentage", "Unit": "PERCENT", "Namespace": "AWS/ElasticMapReduce", "Threshold": 15, "Dimensions": [ { "Key": "JobFlowId", "Value": "j-1CWOHP4PI30VJ" } ], "EvaluationPeriods": 1, "Period": 300, "ComparisonOperator": "LESS_THAN", "Statistic": "AVERAGE" } }, "Description": "", "Action": { "SimpleScalingPolicyConfiguration": { "CoolDown": 300, "AdjustmentType": "CHANGE_IN_CAPACITY", "ScalingAdjustment": 1 } } }, { "Name": "Default-scale-in", "Trigger": { "CloudWatchAlarmDefinition": { "MetricName": "YARNMemoryAvailablePercentage", "Unit": "PERCENT", "Namespace": "AWS/ElasticMapReduce", "Threshold": 75, "Dimensions": [ { "Key": "JobFlowId", "Value": "j-1CWOHP4PI30VJ" } ], "EvaluationPeriods": 1, "Period": 300, "ComparisonOperator": "GREATER_THAN", "Statistic": "AVERAGE" } }, "Description": "", "Action": { "SimpleScalingPolicyConfiguration": { "CoolDown": 300, "AdjustmentType": "CHANGE_IN_CAPACITY", "ScalingAdjustment": -1 } } } ] }, "Configurations": [], "InstanceType": "m5.xlarge", "Market": "ON_DEMAND", "Name": "Core - 2", "ShrinkPolicy": {}, "Status": { "Timeline": { "CreationDateTime": 1479413437.342, "ReadyDateTime": 1479413864.615 }, "State": "RUNNING", "StateChangeReason": { "Message": "" } }, "RunningInstanceCount": 2, "Id": "ig-3M16XBE8C3PH1", "InstanceGroupType": "CORE", "RequestedInstanceCount": 2, "EbsBlockDevices": [] }, { "Configurations": [], "Id": "ig-OP62I28NSE8M", "InstanceGroupType": "MASTER", "InstanceType": "m5.xlarge", "Market": "ON_DEMAND", "Name": "Master - 1", "ShrinkPolicy": {}, "EbsBlockDevices": [], "RequestedInstanceCount": 1, "Status": { "Timeline": { "CreationDateTime": 1479413437.342, "ReadyDateTime": 1479413752.088 }, "State": "RUNNING", "StateChangeReason": { "Message": "" } }, "RunningInstanceCount": 1 } ], "AutoScalingRole": "EMR_AutoScaling_DefaultRole", "Tags": [], "BootstrapActions": [], "Status": { "Timeline": { "CreationDateTime": 1479413437.339, "ReadyDateTime": 1479413863.666 }, "State": "WAITING", "StateChangeReason": { "Message": "Cluster ready after last step completed." } } } }