将自动扩展与 Amazon EMR 中实例组的自定义策略结合使用 - Amazon EMR

将自动扩展与 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 集群容量,您也应考虑基准工作负载需求并规划节点和实例组配置。有关更多信息,请参阅集群配置指南

注意

对于大多数工作负载,需要同时设置横向扩展规则和缩减规则才能优化资源使用率。单独设置其中一种规则意味着,您需要在扩展活动后手动调整实例计数的大小。换句话说,这将通过手动重置来设置“单向”自动横向扩展规则或缩减规则。

为自动伸缩功能创建 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 实例小时边界终止或在任务完成时终止。此设置同时应用于自动扩展和手动调整大小操作。有关此配置的更多信息,请参阅Amazon EMR 集群的集群缩减选项

策略中每个规则的以下参数可确定自动扩展行为。

注意

此处列出的参数基于AWS Management Console上的 Amazon EMR。您使用 AWS CLI 或 Amazon EMR API 时,系统会提供其它高级配置选项。有关高级选项的详细信息,请参阅《Amazon EMR API 参考》中的 SimpleScalingPolicyConfiguration

  • 最大实例数和最小实例数。Maximum instances (最大实例数) 约束指定了实例组可包含的 Amazon EC2 实例的最大数目,并且此约束应用于所有横向扩展规则。同样,Minimum instances (最小实例数) 约束指定了最小 Amazon EC2 实例数,并且此约束应用于所有横向缩减规则。

  • Rule name (规则名称),此参数在策略中必须是唯一的。

  • scaling adjustment (扩展调整),此参数确定在规则触发的扩展活动期间要添加的 EC2 实例的数目(适用于横向扩展规则)或要终止的 EC2 实例的数目(适用于缩减规则)。

  • CloudWatch metric (CloudWatch 指标),针对警报条件监视此参数。

  • comparison operator (比较运算符,用于比较 CloudWatch 指标和 Threshold (阈值) 值并确定触发条件。

  • evaluation period (评估周期),以 5 分钟为增量,在触发扩展活动之前,CloudWatch 指标在这段时间内必须符合触发条件。

  • Cooldown period (冷却时间)(以秒为单位),用于确定由规则启动的一个扩展活动和下一个扩展活动开始之间必须经过的时间量,而不管触发扩展活动的规则如何。当实例组完成扩缩活动并达到其扩展后状态时,冷却时间使得可能会触发后续扩展活动的 CloudWatch 指标实现稳定状态。有关更多信息,请参阅《Amazon EC2 Auto Scaling 用户指南》中的 Auto Scaling 冷却时间

    Amazon EMR AWS Management Console的自动伸缩规则参数。

注意事项和限制

  • 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 (硬件) 设置中修改实例组,为使用中的实例组创建或修改扩展策略。

  1. 导航到 Amazon EMR 新控制台,然后从侧面导航栏中选择切换到旧控制台。有关切换到旧控制台后预期情况的更多信息,请参阅 Using the old console

  2. 如果您正在创建集群,请在 Amazon EMR 控制台中,依次选择 Create Cluster (创建集群)Go to advanced options (转到高级选项)Step 1: Software and Steps (步骤 1: 软件和步骤),然后转至 Step 2: Hardware Configuration (步骤 2: 硬件配置)

    – 或 -

    如果您修改的是正在运行的集群中的实例组,请从集群列表中选择您的集群,然后展开 Hardware (硬件) 部分。

  3. Cluster scaling and provisioning option(集群扩展和预置选项)部分中,选择 Enable cluster scaling(启用集群扩展)。然后,选择 Create a custom automatic scaling policy (创建自定义自动扩展策略)

    Custom automatic scaling policies (自定义自动扩展策略) 表中,单击要配置实例组所在行中显示的铅笔图标。Auto Scaling 规则屏幕将打开。

  4. 键入最大实例数,这是您希望实例组在横向扩展后包含的最大实例数;并键入最小实例数,这是您希望实例组在缩减后包含的最小实例数。

  5. 单击铅笔图标以编辑规则参数,单击 X 以从策略中删除规则,然后单击添加规则以添加其它规则。

  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

创建具有已应用于实例组的自动伸缩策略的集群

您可在 aws emr create-cluster 命令的 --instance-groups 选项内指定自动扩展配置。以下示例说明了一个 create-cluster 命令,其中以内联方式提供核心实例组的自动扩展策略。此命令会创建一个与默认横向扩展策略等效的扩展配置,该策略会在使用 Amazon EMR AWS Management Console 创建自动扩展策略时显示。为简洁起见,不显示缩减策略。建议不要创建没有向内扩展规则的向外扩展规则。

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." } } } }