Amazon EMR
管理指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

使用 Amazon EMR 中的自动扩展功能

利用 Amazon EMR 版本 4.0 和更高版本中的自动扩展功能,可以基于您在扩展策略 中指定的 CloudWatch 指标和其他参数,以编程方式来向外扩展和向内扩展核心节点和任务节点。实例组配置可使用自动扩展,在您使用实例队列时,自动扩展不可用。有关实例组和实例队列的更多信息,请参阅使用实例队列或统一实例组创建集群

扩展策略是实例组配置的一部分。您可以在初始配置实例组的过程中指定策略,或者通过修改现有集群中的实例组 (甚至在实例组处于活动状态时) 来指定策略。集群中的每个实例组 (主实例组除外) 均可拥有自己的扩展策略,该策略包含横向扩展规则和缩减规则。可单独配置横向扩展规则和缩减规则,每种规则具有不同的参数。

可使用 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 的自定义自动扩展角色,建议您根据托管策略制定自定义角色的权限策略。有关更多信息,请参阅 为 IAM 角色配置对 AWS 服务的 Amazon EMR 权限

了解自动扩展规则

当横向扩展规则触发实例组的扩展活动时,将根据您的规则向实例组添加 Amazon EC2 实例。一旦 Amazon EC2 实例进入 InService 状态,应用程序 (例如 Apache Spark 和 Apache Hive) 就可使用新节点。您也可以设置用于终止实例和删除节点的缩减规则。有关可自动扩展的 Amazon EC2 实例的生命周期的更多信息,请参阅 Amazon EC2 Auto Scaling User Guide 中的自动扩展生命周期

您可以配置集群终止 Amazon EC2 实例的方式,可以选择在用于计费的 Amazon EC2 实例小时边界终止或在任务完成时终止。此设置同时应用于自动扩展和手动调整大小操作。有关此配置的更多信息,请参阅集群缩减

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

注意

此处列出的参数基于适用于 Amazon EMR 的 AWS Management Console。在使用 AWS CLI 或 Amazon EMR API 时,提供了其他高级配置选项。有关高级选项的更多信息,请参阅 Amazon EMR API Reference 中的 SimpleScalingPolicyConfiguration

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

  • Rule name,此参数在策略中必须是唯一的。

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

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

  • comparison operator,用于比较 CloudWatch 指标和 Threshold 值并确定触发条件。

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

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

     Amazon EMR 的 AWS Management Console自动扩展规则参数。

使用 AWS Management Console配置自动扩展功能

在创建集群时,可以使用高级集群配置选项为实例组配置扩展策略。此外,您也可以通过在现有集群的 Hardware 设置中修改实例组,为使用中的实例组创建或修改扩展策略。

  1. 如果您正在创建集群,请在 Amazon EMR 控制台中,选择 Create Cluster,再选择 Go to advanced options,选择 Step 1: Software and Steps 的选项,然后转至 Step 2: Hardware Configuration

    —或者—

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

  2. 单击要配置的实例组的 Auto Scaling 列中显示的铅笔图标。如果已为实例组配置自动扩展策略,则 Maximum instances 数和 Minimum instances 数将显示在此列中;否则,将显示 Not enabled

    自动扩展规则屏幕将打开。默认情况下,将选择 Scale outScale in,并且将使用适用于许多应用程序的设置预配置默认规则。

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

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

  5. 选择本主题前面介绍的规则参数。有关 Amazon EMR 的可用 CloudWatch 指标的描述,请参阅 Amazon CloudWatch User Guide 中的 Amazon EMR 指标和维度

使用 AWS CLI 配置自动扩展

在创建集群时以及在创建实例组时,可以使用适用于 Amazon EMR 的 AWS CLI 命令配置自动扩展。您可以使用速记语法 (可在相关命令中指定内联 JSON 配置)。也可以引用包含配置 JSON 的文件。您也可以将一个自动扩展策略应用于现有实例组并删除以前应用的自动扩展策略。此外,您可以从正在运行的集群中检索扩展策略配置的详细信息。

重要

在创建具有自动扩展策略的集群时,您必须使用 --auto-scaling-role MyAutoScalingRole 命令来指定用于 AutoScaling 的 IAM 角色。默认角色为 EMR_AutoScaling_DefaultRole,可使用 create-default-roles 命令创建它。此角色只能在创建集群时添加且无法添加到现有集群。

有关配置自动扩展策略时可用的参数的详细描述,请参阅 Amazon EMR API Reference 中的 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=m4.large,InstanceCount=1 'Name=MyCoreIG,InstanceGroupType=CORE,InstanceType=m4.large,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": "m4.large" }, { "InstanceCount": 2, "Name": "MyCoreIG", "InstanceGroupType": "CORE", "InstanceType": "m4.large", "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 文件的内容,此文件定义上一示例中显示的相同的横向扩展规则。

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

从实例组中删除自动扩展策略

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": 0.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": "m4.large", "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": "m4.large", "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": [], "VisibleToAllUsers": true, "BootstrapActions": [], "Status": { "Timeline": { "CreationDateTime": 1479413437.339, "ReadyDateTime": 1479413863.666 }, "State": "WAITING", "StateChangeReason": { "Message": "Cluster ready after last step completed." } } } }