本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
将自动扩展与 Amazon EMR 中实例组的自定义策略结合使用
通过在 Amazon EMR 4.0 及更高版本中使用自定义策略自动扩展,您可以根据您在扩展策略中指定的 CloudWatch 指标和其他参数,以编程方式扩展和扩展核心节点和任务节点。实例组配置可使用具有自定义策略的自动扩展,在您使用实例队列时,自动扩展不可用。有关实例组和实例队列的更多信息,请参阅使用实例集或统一实例组创建 Amazon EMR 集群。
注意
要在 Amazon EMR 中使用具有自定义策略功能的自动伸缩,您必须在创建集群时为 VisibleToAllUsers
参数设置 true
。有关更多信息,请参阅 SetVisibleToAllUsers。
扩展策略是实例组配置的一部分。您可以在初始配置实例组的过程中指定策略,或者通过修改现有集群中的实例组 (甚至在实例组处于活动状态时) 来指定策略。集群中的每个实例组(主实例组除外)均可拥有自己的扩展策略,该策略包含横向扩展和横向缩减规则。可单独配置横向扩展规则和缩减规则,每种规则具有不同的参数。
您可以使用 AWS Management Console AWS CLI、或 Amazon EMR API 配置扩展策略。当您使用 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
。如果您创建了一个适用于 Amazon EMR 的自定义自动伸缩角色,建议您根据托管式策略制定自定义角色的权限策略。有关更多信息,请参阅为 Amazon EMR 配置 IAM 服务角色对 AWS
服务和资源的权限。MyEMRAutoScalingRole
了解自动伸缩角色
当扩展规则触发实例组的扩展活动时,Amazon EC2 实例将根据您的规则添加到该实例组中。一旦亚马逊 EC2 实例进入状态,Apache Spark、Apache Hive 和 Presto 等应用程序就可以使用新节点。InService
您也可以设置用于终止实例和删除节点的缩减规则。有关自动扩展的亚马逊 EC2 实例生命周期的更多信息,请参阅 Amazon A uto Scaling 用户指南中的 A EC2 uto Scaling 生命周期。
您可以配置集群如何终止 Amazon EC2 实例。您可以选择在计费的 Amazon EC2 实例小时上限终止,也可以在任务完成后终止。此设置同时应用于自动扩展和手动调整大小操作。有关此配置的更多信息,请参阅Amazon EMR 集群的集群缩减选项。
策略中每个规则的以下参数可确定自动扩展行为。
注意
此处列出的参数基于 AWS Management Console 适用于 Amazon EMR 的。当您使用 AWS CLI 或 Amazon EMR API 时,还有其他高级配置选项可用。有关高级选项的更多信息,请参阅 Amazon EMR API 参考SimpleScalingPolicyConfiguration中的。
-
最大实例数和最小实例数。最大实例数限制规定了实例组中可以 EC2包含的最大 Amazon 实例数,并且适用于所有扩展规则。同样,最小实例数限制规定了 Amazon EC2 实例的最小数量,并适用于所有缩减规则。
-
Rule name (规则名称),此参数在策略中必须是唯一的。
-
扩展调整,它决定在规则触发的扩展活动期间要添加(对于扩展规则)或终止(对于缩小规则)的 EC2 实例数量。
-
CloudWatch 指标,监视警报情况。
-
比较运算符,用于将CloudWatch 指标与阈值进行比较并确定触发条件。
-
评估期,以五分钟为增量,在此期间, CloudWatch 指标必须处于触发状态,然后才会触发扩展活动。
-
Cooldown period (冷却时间)(以秒为单位),用于确定由规则启动的一个扩展活动和下一个扩展活动开始之间必须经过的时间量,而不管触发扩展活动的规则如何。当实例组完成扩展活动并达到扩展后状态时,冷却时间为可能触发后续扩展活动的 CloudWatch 指标提供了稳定下来的机会。有关更多信息,请参阅 Amazon Auto Scaling 用户指南中的 A EC2 uto Scaling 冷却时间。
注意事项和限制
-
亚马逊 CloudWatch 指标对于 Amazon EMR 自动扩展的运行至关重要。我们建议您密切监控 Amazon CloudWatch 指标,确保数据不会丢失。有关如何配置 Amazon CloudWatch 警报以检测缺失指标的更多信息,请参阅使用 Amazon CloudWatch 警报。
-
过度使用 EBS 卷可能会导致托管扩展问题。我们建议您密切监控 EBS 卷的使用情况,以确保 EBS 卷的利用率低于 90%。请参阅 实例存储 以了解有关指定额外 EBS 卷的信息。
-
在 Amazon EMR 版本 5.18 至 5.28 中使用自定义策略进行自动扩展可能会遇到由于亚马逊指标中间歇性缺少数据而导致扩展失败。 CloudWatch我们建议您使用最新版本的 Amazon EMR 来改进自动扩展。如果您希望使用 5.18 到 5.28 之间的 Amazon EMR 发行版,也可以联系 AWS Support
获取补丁。
使用配置 AWS Management Console 自动缩放
创建集群时,可以使用高级集群配置选项为实例组配置扩展策略。此外,您也可以通过在现有集群的 Hardware (硬件) 设置中修改实例组,为使用中的实例组创建或修改扩展策略。
导航到 Amazon EMR 新控制台,然后从侧面导航栏中选择切换到旧控制台。有关切换到旧控制台后预期情况的更多信息,请参阅 Using the old console。
-
如果您正在创建集群,请在 Amazon EMR 控制台中,依次选择 Create Cluster (创建集群)、Go to advanced options (转到高级选项)、Step 1: Software and Steps (步骤 1: 软件和步骤),然后转至 Step 2: Hardware Configuration (步骤 2: 硬件配置)。
– 或 -
如果您修改的是正在运行的集群中的实例组,请从集群列表中选择您的集群,然后展开 Hardware (硬件) 部分。
-
在 Cluster scaling and provisioning option(集群扩展和预置选项)部分中,选择 Enable cluster scaling(启用集群扩展)。然后,选择 Create a custom automatic scaling policy (创建自定义自动扩展策略)。
在 Custom automatic scaling policies (自定义自动扩展策略) 表中,单击要配置实例组所在行中显示的铅笔图标。Auto Scaling 规则屏幕将打开。
-
键入最大实例数,这是您希望实例组在横向扩展后包含的最大实例数;并键入最小实例数,这是您希望实例组在缩减后包含的最小实例数。
-
单击铅笔图标以编辑规则参数,单击 X 以从策略中删除规则,然后单击添加规则以添加其它规则。
-
选择本主题前面介绍的规则参数。有关亚马逊 EMR 可用 CloudWatch 指标的描述,请参阅亚马逊用户指南中的亚马逊 EMR 指标和维度。 CloudWatch
使用配置 AWS CLI 自动缩放
在创建集群和创建实例组时,您可以使用 Amazon EMR AWS CLI 命令配置自动扩展。您可以使用速记语法 (可在相关命令中指定内联 JSON 配置)。也可以引用包含配置 JSON 的文件。您也可以将一个自动扩展策略应用于现有实例组并删除以前应用的自动扩展策略。此外,您可以从正在运行的集群中检索扩展策略配置的详细信息。
重要
在创建具有自动伸缩策略的集群时,您必须使用 --auto-scaling-role
命令来指定用于自动伸缩的 IAM 角色。默认角色为 MyAutoScalingRole
,可使用 EMR_AutoScaling_DefaultRole
create-default-roles
命令创建它。此角色只能在创建集群时添加且无法添加到现有集群。
有关配置自动扩展策略时可用参数的详细说明,请参阅 PutAutoScalingPolicyAmazon EMR API 参考。
创建具有已应用于实例组的自动伸缩策略的集群
您可在 aws emr
create-cluster
命令的 --instance-groups
选项内指定自动扩展配置。以下示例说明了一个 create-cluster 命令,其中以内联方式提供核心实例组的自动扩展策略。该命令创建的扩展配置等同于默认的横向扩展策略,当您使用 for AWS Management Console 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-idig-3PLUZBA6WLS07
--auto-scaling-policyfile://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-idig-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." } } } }