カスタムポリシーによる自動スケーリングを 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
) を作成して、クラスター作成時に指定することもできます。カスタマイズされた自動スケーリングロールを Amazon EMR 向けに作成する場合は、管理ポリシーに基づいたカスタムロールのアクセス許可ポリシーをベースにすることをお勧めします。詳細については、「AWS のサービスおよびリソースへのアクセス許可を Amazon EMR に付与する IAM サービスロールの設定」を参照してください。MyEMRAutoScalingRole
自動スケーリングルールについて
スケールアウトルールがインスタンスグループのスケーリングをトリガーするときに、ルールに従って Amazon EC2 インスタンスがインスタンスグループに追加されます。Amazon EC2 インスタンスが InService
状態になるとすぐに、Apache Spark、Apache Hive、Presto などのアプリケーションで新しいノードを使用できます。インスタンスを終了し、ノードを削除するスケールインルールを設定することもできます。自動的にスケーリングする Amazon EC2 インスタンスのライフサイクルの詳細については、「Amazon EC2 Auto Scaling ユーザーガイド」の「Auto Scaling のライフサイクル」を参照してください。
クラスターが Amazon EC2 インスタンスを削除する方法を設定できます。請求の Amazon EC2 インスタンス時間の境界と、タスクの完了時のどちらで削除するかを選択できます。この設定は自動スケーリングと手動でのサイズ変更オペレーションの両方に適用されます。この設定の詳細については、「Amazon EMR クラスターのクラスタースケールダウンオプション」を参照してください。
ポリシー内の各ルールのうち、次のパラメータで自動スケーリングの動作を決定します。
注記
ここに記載されたパラメータは、Amazon EMR の AWS Management Console に基づいています。AWS CLI または Amazon EMR API を使用すると、追加の詳細設定オプションを使用できます。詳細オプションついて詳しくは、「Amazon EMR API リファレンス」の「SimpleScalingPolicyConfiguration」を参照してください。
-
最大インスタンスおよび最小インスタンス。[最大インスタンス] という制約は、インスタンスグループに含めることができる Amazon EC2 インスタンスの最大数を指定します。これはすべてのスケールアウトルールに適用されます。同様に、[最小インスタンス] という制約は、Amazon EC2 インスタンスの最小数を指定します。これはすべてのスケールインルールに適用されます。
-
ルール名は、ポリシー内で一意である必要があります。
-
スケーリング調整は、ルールによりトリガーされた規模の拡大や縮小の間に追加 (スケールアウトルールの場合)、または終了 (スケールインルールの場合) する EC2 インスタンスの数を決定します。
-
CloudWatch メトリクスは、アラーム条件用に監視されます。
-
比較演算子は、CloudWatch メトリクスをしきい値と比較してトリガー条件を決定します。
-
評価期間は、5 分単位で増分します。規模の拡大や縮小がトリガーされる前に CloudWatch メトリクスがトリガー条件になる必要があります。
-
クールダウン期間 (秒単位) は、何らかのルールによって開始されるスケーリングアクティビティと、次に開始されるスケーリングアクティビティとの間で経過する必要がある時間です。インスタンスグループがスケーリングを完了し、スケーリング後の状態に達したときに、クールダウン期間によって、後続のスケーリングをトリガーする可能性のある CloudWatch メトリクスを安定させることができます。詳細については、「Amazon EC2 Auto Scaling ユーザーガイド」の「Auto Scaling のクールダウン」を参照してください。
考慮事項と制限事項
-
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 サポート
にお問い合わせいただくこともできます。
AWS Management Console を使用して自動スケーリングを設定する
クラスターを作成する際、高度なクラスター設定オプションを使用して、インスタンスグループにスケーリングポリシーを設定します。既存のクラスターのハードウェア設定でインスタンスグループを変更することにより、実行中のインスタンスグループのスケーリングポリシーを作成または変更することもできます。
新しい Amazon EMR コンソールに移動し、サイドナビゲーションから [古いコンソールに切り替え] を選択します。古いコンソールに切り替えたときの動作の詳細については、「Using the old console」を参照してください。
-
クラスターを作成する場合、Amazon EMR コンソールで、[クラスターの作成] を選択し、[詳細オプションに移動する] を選択します。次に、[ステップ 1: ソフトウェアおよびステップ] のオプションを選択し、[ステップ 2: ハードウェア構成] に移動します。
- または -
実行中のクラスターのインスタンスグループを変更する場合、クラスターリストからクラスターを選択し、その後 [ハードウェア] セクションを展開します。
-
[クラスターのスケーリングとプロビジョニングのオプション] セクションで [クラスタースケーリングを有効にする] を選択します。次に、[Create a custom Auto Scaling policy (カスタムの自動スケーリングポリシーを作成する)] を選択します。
[Custom automatic scaling policies (カスタムの自動スケーリングポリシー)] の表で、設定するインスタンスグループの行に表示されている鉛筆アイコンをクリックします。Auto Scaling ルールの画面が開きます。
-
インスタンスグループをスケールアウトした後に含める最大インスタンスを入力するか、インスタンスグループをスケールインした後に含める最小インスタンスを入力します。
-
ルールのパラメータを編集するには鉛筆をクリックします。ポリシーからルールを削除するには [X] を、ルールを追加するには [Add rule] をクリックします。
-
このトピックで先に記載したとおり、ルールのパラメータを選択します。Amazon EMR で利用可能な CloudWatch メトリクスの説明については、「Amazon CloudWatch ユーザーガイド」の「Amazon EMR のメトリクスとディメンション」を参照してください。
AWS CLI を使用して自動スケーリングを設定する
Amazon EMR の AWS CLI コマンドを使用して、クラスターの作成時とインスタンスグループの作成時に自動スケーリングを設定できます。短縮構文を使用して、関連コマンドのインラインで JSON 設定を指定したり、設定 JSON を含むファイルを参照したりできます。既存のインスタンスグループに自動スケーリングポリシーを適用したり、以前適用されていた自動スケーリングポリシーを削除することもできます。さらに、スケーリングポリシーの詳細設定を実行中のクラスターから取得できます。
重要
自動スケーリングポリシーを持つクラスターを作成するときは、--auto-scaling-role
コマンドを使用して、自動スケーリング用の IAM ロールを指定する必要があります。デフォルトロールは、MyAutoScalingRole
で、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}" } ] } } } ] } } ]
自動スケーリングポリシーを持つインスタンスグループをクラスターに追加する
create-cluster
を使用するときと同じ方法で、--instance-groups
オプションを使用して、add-instance-groups
コマンドでスケーリングポリシーの設定を指定できます。次の例では、インスタンスグループ設定がある 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." } } } }