Amazon EMR
管理ガイド

Amazon EMR で自動スケーリングを使用する

Amazon EMR リリースバージョン 4.0 以降の自動スケーリングを使用すると、スケーリングポリシーで指定した CloudWatch メトリクスやその他のパラメータに基づいて、プログラムでコアノードやタスクノードをスケールアウトまたはスケールインできます。自動スケーリングはインスタンスグループ設定を使用するときに利用できます。インスタンスフリートを使用するときには利用できません。インスタンスグループとインスタンスフリートの詳細については、「インスタンスフリートまたはユニフォームインスタンスグループでクラスターを作成する」を参照してください。

注記

Amazon EMR で Auto Scaling 機能を使用するには、クラスター作成時の VisibleToAllUsers パラメータのデフォルト設定 true を保持する必要があります。詳細については、「SetVisibleToAllUsers」を参照してください。

スケーリングポリシーは、インスタンスグループ設定の一部です。インスタンスグループの初期設定時にポリシーを指定するか、インスタンスグループがアクティブになった後でも、既存のクラスターのインスタンスグループを変更して、ポリシーを指定できます。マスターインスタンスグループを除くクラスター内の各インスタンスグループは、独自のスケーリングポリシーを持つことができます。スケーリングポリシーはスケールアウトルールとスケールインルールで構成されます。スケールアウトルールとスケールインルールは、それぞれに異なるパラメータを用いて、個別に設定できます。

AWS マネジメントコンソール、AWS CLI、または Amazon EMR API を使用してスケーリングポリシーを設定できます。AWS CLI または Amazon EMR API を使用する場合は、スケーリングポリシーを JSON 形式で指定します。また、AWS CLI か Amazon EMR API を使用して、カスタム CloudWatch メトリクスを指定することができます。カスタムのメトリクスは、AWS マネジメントコンソール を使用した選択には使用できません。最初にコンソールを使用してスケーリングポリシーを作成する場合は、まず、多数のアプリケーションが事前設定されているデフォルトのポリシーが適しています。デフォルトのルールは削除したり変更できます。

自動スケーリングを使用すれば、実行中でも EMR クラスターの容量を変更できますが、ベースラインとなるワークロード要件を考慮し、ノードおよびインスタンスグループ設定を計画してください。詳細については、「クラスター設定のガイドライン」を参照してください。

注記

ほとんどのワークロードで、リソースの活用を最適化するには、スケールイン、スケールアウトの両方のルールを設定することが理想となります。一方を設定せずにどちらかのルールのみを設定すると、規模の拡大や縮小の後に、インスタンスカウントを手動でサイズ調整する必要があります。つまりこの方法では、手動でのリセットを伴う「一方通行の」自動スケールアウトまたはスケールインポリシーを設定することになります。

自動スケーリングの IAM ロールを作成する

Amazon EMR での自動スケーリングには、スケーリングアクティビティがトリガーされたときにインスタンスを追加および終了する権限がある IAM ロールが必要です。デフォルトロールである EMR_AutoScaling_DefaultRole は、適切なロールポリシーと信頼ポリシーで設定されており、この目的に使用できます。AWS マネジメントコンソール でスケーリングポリシーを使用して初めてクラスターを作成する場合、Amazon EMR はデフォルトのロールを作成し、アクセス許可に必要なデフォルトの管理ポリシー (AmazonElasticMapReduceforAutoScalingRole) をアタッチします。

AWS CLI で自動スケーリングポリシーを使用してクラスターを作成する場合は、まず、デフォルトの IAM ロール、または適切なアクセス許可のポリシーがアタッチされているカスタム IAM ロールが存在するかどうかを確認する必要があります。デフォルトロールを作成するには、クラスターを作成する前に create-default-roles コマンドを実行します。その後、クラスターの作成時に --auto-scaling-role EMR_AutoScaling_DefaultRole オプションを指定します。または、カスタムの自動スケーリングロール (例: --auto-scaling-role MyEMRAutoScalingRole) を作成して、クラスター作成時に指定することもできます。カスタマイズされた自動スケーリングロールを Amazon EMR 向けに作成する場合、管理ポリシーに基づいたカスタムロールのアクセス許可ポリシーをベースにすることをお勧めします。詳細については、「AWS のサービスおよびリソースへのアクセス許可を Amazon EMR に付与する IAM サービスロールの設定」を参照してください。

自動スケーリングルールについて

スケールアウトルールがインスタンスグループの規模の拡大や縮小をトリガーする場合、ルールに基づいて Amazon EC2 インスタンスがインスタンスグループに追加されます。Amazon EC2 インスタンスが InService 状態になるとすぐに、アプリケーションは Apache Spark や Apache Hive などの新しいノードを使用できます。インスタンスを終了し、ノードを削除するスケールインルールを設定することもできます。自動的にスケーリングする Amazon EC2 インスタンスのライフサイクルの詳細については、Amazon EC2 Auto Scaling ユーザーガイドの「Auto Scaling ライフサイクル」を参照してください。

クラスターが Amazon EC2 インスタンスを削除する方法を設定できます。請求の Amazon EC2 インスタンス時間の境界、またはタスクの完了時のどちらで終了するかを選択できます。この設定は自動スケーリングと手動でのサイズ変更オペレーションの両方に適用されます。この設定の詳細については、「クラスターのスケールダウン」を参照してください。

ポリシー内の各ルールのうち、次のパラメータで自動スケーリングの動作を決定します。

注記

ここに記載されたパラメータは、Amazon EMR の AWS マネジメントコンソール に基づいています。AWS CLI または Amazon EMR API を使用する場合は、追加の詳細設定オプションが使用できます。詳細オプションについて詳しくは、Amazon EMR API Referenceの「SimpleScalingPolicyConfiguration」を参照してください。

  • 最大インスタンスおよび最小インスタンス。最大インスタンスの制約で、インスタンスグループに含められる Amazon EC2 インスタンスの最大数を指定します。これはすべてのスケールアウトルールに適用されます。同様に、最小インスタンスの制約で、Amazon EC2 インスタンスの最小数を指定します。これはすべてのスケールインルールに適用されます。

  • ルール名は、ポリシー内で一意である必要があります。

  • スケーリング調整は、ルールによりトリガーされた規模の拡大や縮小の間に追加 (スケールアウトルールの場合)、または終了 (スケールインルールの場合) する EC2 インスタンスの数を決定します。

  • CloudWatch メトリクスは、アラーム条件用に監視されます。

  • 比較演算子は、CloudWatch メトリクスをしきい値と比較してトリガー条件を決定します。

  • 評価期間は、5 分単位で増分します。規模の拡大や縮小がトリガーされる前に CloudWatch メトリクスがトリガー条件になる必要があります。

  • クールダウン期間 (秒単位) は、何らかのルールによって開始されるスケーリングアクティビティと、次に開始されるスケーリングアクティビティとの間で経過する必要がある時間です。インスタンスグループが規模の拡大や縮小を完了し、スケーリング後の状態に達した際、クールダウンすることで、後続の規模の拡大や縮小をトリガーする可能性のある CloudWatch メトリクスが安定する機会が与えられます。詳細については、Amazon EC2 Auto Scaling ユーザーガイドの「Auto Scaling のクールダウン」を参照してください。

    
								AWS マネジメントコンソール の Amazon EMR の自動スケーリングルールパラメータ。

AWS マネジメントコンソール を使用して自動スケーリングを設定する

クラスターを作成する際、高度なクラスター設定オプションを使用して、インスタンスグループにスケーリングポリシーを設定します。既存のクラスターのハードウェア設定でインスタンスグループを変更することにより、実行中のインスタンスグループのスケーリングポリシーを作成または変更することもできます。

  1. クラスターを作成する場合、Amazon EMR コンソールで、[Create Cluster (クラスターの作成)]、[Go to advanced options (詳細オプションに移動)] の順に選択し、[Step 1: Software and Steps (ステップ 1: ソフトウェアとステップ)] のオプションを選択してから [Step 2: Hardware Configuration (ステップ 2: ハードウェア構成)] に移動します。

    —または—

    実行中のクラスターのインスタンスグループを変更する場合、クラスターリストからクラスターを選択し、その後 [ハードウェア] セクションを展開します。

  2. 設定するインスタンスグループの [Auto Scaling] 列に表示される鉛筆アイコンをクリックします。インスタンスグループに自動スケーリングポリシーがすでに設定されている場合、最大インスタンス数と最小インスタンス数がこの列に表示されます。設定されていない場合は、「有効でない」と表示されます。

    Auto Scaling ルールの画面が開きます。デフォルトで、[スケールアウト] と [スケールイン] が選択されています。多くのアプリケーションに適切な設定で、デフォルトのルールが事前設定されています。

  3. インスタンスグループをスケールアウトした後に含める最大インスタンスを入力するか、インスタンスグループをスケールインした後に含める最小インスタンスを入力します。

  4. ルールのパラメータを編集するには鉛筆をクリックします。ポリシーからルールを削除するには [X] を、ルールを追加するには [Add rule] をクリックします。

  5. このトピックで先に記載したとおり、ルールのパラメータを選択します。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 Referenceの「PutAutoScalingPolicy」を参照してください。

インスタンスグループに適用する、自動スケーリングポリシーを持つクラスターを作成する

aws emr create-cluster コマンドの --instance-groups オプション内で自動スケーリング設定を指定できます。次の例は、create-cluster コマンドを示しています。このコマンドには、インラインにコアインスタンスグループの自動スケーリングポリシーがあります。このコマンドは、Amazon EMR の AWS マネジメントコンソール を使用して自動スケーリングポリシーを作成したときに表示される、デフォルトのスケールアウトポリシーに相当するスケーリング設定を作成します。簡潔にするために、スケールインポリシーは表示されません。スケールインルールなしで、スケールアウトルールを作成するのは推奨されていません。

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 ファイルのコンテンツは、前の例と同じスケールアウトルールを定義するもので、次に示されています。

[{ "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": 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." } } } }