将自动伸缩与实例组的自定义策略结合使用 - Amazon EMR

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

将自动伸缩与实例组的自定义策略结合使用

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

注意

要在 Amazon 中使用带有自定义策略的自动扩展功能EMR,您必须在创建集群时trueVisibleToAllUsers参数进行设置。有关更多信息,请参阅SetVisibleToAllUsers

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

您可以使用配置扩展策略 AWS Management Console, AWS CLI,或者亚马逊EMRAPI。当你使用 AWS CLI 或者 Amazon EMRAPI,您可以按JSON格式指定扩展策略。此外,当使用 AWS CLI 或者 Amazon EMRAPI,您可以指定自定义 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,我们建议您根据托管策略为自定义角色制定权限策略。有关更多信息,请参阅 配置IAM服务角色以获得 Amazon 的EMR权限 AWS 服务和资源

了解自动伸缩角色

当扩展规则触发实例组的扩展活动时,Amazon EC2 实例将根据您的规则添加到该实例组中。一旦亚马逊EC2实例进入状态,Apache Spark、Apache Hive 和 Presto 等应用程序就可以使用新节点。InService您也可以设置用于终止实例和删除节点的缩减规则。有关自动扩展的亚马逊EC2实例生命周期的更多信息,请参阅 Amazon A uto Scaling 用户指南中的 A EC2 uto Scaling 生命周期

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

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

注意

此处列出的参数基于 AWS Management Console 适用于亚马逊EMR。当你使用 AWS CLI 或者 Amazon EMRAPI,还有其他高级配置选项可供选择。有关高级选项的更多信息,请参阅 Amazon EMR API 参考SimpleScalingPolicyConfiguration中的。

  • 最大实例数和最小实例数。最大实例数限制规定了实例组中可以EC2包含的最大 Amazon 实例数,并且适用于所有扩展规则。同样,最小实例数限制规定了 Amazon EC2 实例的最小数量,并适用于所有缩减规则。

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

  • 扩展调整,它决定在规则触发的扩展活动期间要添加(对于扩展规则)或终止(对于缩小规则)的EC2实例数量。

  • CloudWatch 指标,监视是否存在警报情况。

  • 比较运算符,用于将CloudWatch 指标与值进行比较并确定触发条件。

  • 评估期,以五分钟为增量,在此期间, CloudWatch 指标必须处于触发状态,然后才会触发扩展活动。

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

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

注意事项和限制

  • 亚马逊的 CloudWatch 指标对于亚马逊EMR自动扩展的运行至关重要。我们建议您密切监控 Amazon CloudWatch 指标,确保数据不会丢失。有关如何配置 Amazon CloudWatch 警报以检测缺失指标的更多信息,请参阅使用 Amazon CloudWatch 警报

  • 过度使用EBS卷可能会导致托管扩展问题。我们建议您密切监视EBS卷使用情况,确保EBS卷利用率低于 90%。有关指定其他EBS卷的信息,请参阅实例存储

  • 在 Amazon 5.18 到 5.28 EMR 版本中使用自定义策略进行自动扩展可能会遇到由于亚马逊指标中间歇性缺少数据而导致扩展失败。 CloudWatch我们建议您使用最新的 Amazon EMR 版本来改进自动扩展。你也可以联系 AWS 如果您需要使用 5.18 和 5.28 之间的 Amazon EMR 版本,则支持补丁。

使用 AWS Management Console 配置自动缩放

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

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

  2. 如果您要创建集群,请在 Amazon EMR 控制台中选择 “创建集群”,选择 “转到高级选项”,选择 “步骤 1:软件和步骤” 的选项,然后转到步骤 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. 选择本主题前面介绍的规则参数。有关亚马逊可用 CloudWatch 指标的描述EMR,请参阅亚马逊 CloudWatch 用户指南中的亚马逊EMR指标和维度

使用 AWS CLI 配置自动缩放

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

重要

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

有关配置自动扩展策略时可用参数的详细说明,请参阅 PutAutoScalingPolicyAmazon EMR API 参考

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

您可在 aws emr create-cluster 命令的 --instance-groups 选项内指定自动扩展配置。以下示例说明了一个 create-cluster 命令,其中以内联方式提供核心实例组的自动扩展策略。该命令创建的扩展配置等同于默认的向外扩展策略,该配置在您使用创建自动扩展策略时会出现 AWS Management Console 适用于亚马逊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角色的集群的一部分。以下示例使用了对文件的引用autoscaleconfig.json,该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." } } } }