Amazon EMR と EC2 プレイスメントグループの統合
Amazon EC2 で Amazon EMR の複数のプライマリノードクラスターを起動する場合、プレイスメントグループ戦略を使用して、ハードウェア障害から保護するためにプライマリノードインスタンスをデプロイする方法を指定することができます。
プレイスメントグループ機能は、複数のプライマリノードクラスターのオプションとして Amazon EMR バージョン 5.23.0 以降でサポートされています。現在、プレイスメントグループ機能ではプライマリノードタイプのみがサポートされており、SPREAD
戦略は、これらのプライマリノードに適用されます。SPREAD
戦略では、ハードウェア障害の発生時に複数のプライマリノードが失われるのを防ぐため、少数のインスタンスを別個の基盤となるハードウェア全体に配置します。リクエストを実行するための固有のハードウェアが不足している場合、インスタンスの起動リクエストが失敗する可能性があることに注意してください。EC2 プレイスメント戦略および制限については、「Linux インスタンス用 EC2 ユーザーガイド」の「プレイスメントグループ」を参照してください。
Amazon EC2 には、起動可能なプレイスメントグループ戦略対応クラスター数が AWS リージョンあたり 500 という初期制限があります。許可されたプレイスメントグループ数の引き上げをリクエストするには、AWS サポートにお問い合わせください。Amazon EMR が Amazon EMR プレイスメントグループ戦略に関連付けているキーと値のペアを追跡することで、Amazon EMR が作成する EC2 プレイスメントグループを識別できます。EC2 クラスターのインスタンスタグの詳細については、「Amazon EC2 でクラスターインスタンスを表示する」を参照してください。
Amazon EMRrole にプレイスメントグループの管理ポリシーをアタッチする
Amazon EMR が Amazon EC2 でプレイスメントグループを作成、削除、および記述できるようにするために、プレイスメントグループ戦略には AmazonElasticMapReducePlacementGroupPolicy
という管理ポリシーが必要です。複数のプライマリノードを持つ Amazon EMR クラスターを起動する前に、AmazonElasticMapReducePlacementGroupPolicy
を Amazon EMR のサービスロールにアタッチする必要があります。
プレイスメントグループ管理ポリシーの代わりに AmazonEMRServicePolicy_v2
管理ポリシーを Amazon EMR ロールにアタッチできます。AmazonEMRServicePolicy_v2
は Amazon EC2 のプレイスメントグループに対して、AmazonElasticMapReducePlacementGroupPolicy
と同じアクセスを許可します。詳細については、「Amazon EMR のサービスロール (EMR ロール)」を参照してください。
AmazonElasticMapReducePlacementGroupPolicy
管理ポリシーは、Amazon EMR が作成および管理する次の JSON テキストです。
AmazonElasticMapReducePlacementGroupPolicy
管理ポリシーは自動的に更新されるため、次に示すポリシーは最新のものでない可能性があります。AWS マネジメントコンソールを使用して、現在のポリシーを表示します。
{
"Version":"2012-10-17",
"Statement":[
{
"Resource":"*",
"Effect":"Allow",
"Action":[
"ec2:DeletePlacementGroup",
"ec2:DescribePlacementGroups"
]
},
{
"Resource":"arn:aws:ec2:*:*:placement-group/pg-*",
"Effect":"Allow",
"Action":[
"ec2:CreatePlacementGroup"
]
}
]
}
プレイスメントグループ戦略を使用して、複数のプライマリノードを持つ Amazon EMR クラスターを起動する
プレイスメントグループ戦略を使用して複数のプライマリノードを持つ Amazon EMR クラスターを起動するには、プレイスメントグループマネージドポリシー AmazonElasticMapReducePlacementGroupPolicy
を Amazon EMR ロールにアタッチします。詳細については、「Amazon EMRrole にプレイスメントグループの管理ポリシーをアタッチする」を参照してください。
このロールを使用して複数のプライマリノードを持つ Amazon EMR クラスターを起動するたびに、Amazon EMR は、それらのプライマリノードに適用される SPREAD
戦略を使用してクラスターを起動しようとします。プレイスメントグループマネージドポリシー AmazonElasticMapReducePlacementGroupPolicy
がアタッチされていないロールを使用する場合、Amazon EMR は、プレイスメントグループ戦略なしで複数のプライマリノードを持つ Amazon EMR クラスターを起動しようとします。
Amazon EMR EMRAPI または CLI を使用して placement-group-configs
パラメータを指定して複数のプライマリノードを持つ Amazon EMR クラスターを起動する場合、Amazon EMR は Amazon EMR ロールにプレイスメントグループマネージドポリシー AmazonElasticMapReducePlacementGroupPolicy
がアタッチされている場合にのみクラスターを起動します。Amazon EMR ロールにポリシーがアタッチされていない場合、複数のプライマリノードを持つ Amazon EMR クラスターの起動は失敗します。
- Amazon EMR API
-
例 - プレイスメントグループ戦略を使用して、Amazon EMR API から複数のプライマリノードを持つインスタンスグループクラスターを起動する
RunJobFlow アクションを使用して複数のプライマリノードを持つ Amazon EMR クラスターを作成する場合、PlacementGroupConfigs
プロパティを以下のように設定します。現在、MASTER
インスタンスロールは、自動的に SPREAD
をプレイスメントグループ戦略として使用します。
{
"Name":"ha-cluster",
"PlacementGroupConfigs":[
{
"InstanceRole":"MASTER"
}
],
"ReleaseLabel": emr-6.15.0,
"Instances":{
"ec2SubnetId":"subnet-22XXXX01",
"ec2KeyName":"ec2_key_pair_name",
"InstanceGroups":[
{
"InstanceCount":3,
"InstanceRole":"MASTER",
"InstanceType":"m5.xlarge"
},
{
"InstanceCount":4,
"InstanceRole":"CORE",
"InstanceType":"m5.xlarge"
}
]
},
"JobFlowRole":"EMR_EC2_DefaultRole",
"ServiceRole":"EMR_DefaultRole"
}
-
ha-cluster
を自分の高可用性クラスター名に置き換えます。
-
subnet-22XXXX01
をサブネット ID に置き換えます。
-
ec2_key_pair_name
をこのクラスターの EC2 キーペアの名前に置き換えます。EC2 キーペアはオプションであり、SSH を使用してクラスターにアクセスする場合にのみ必須です。
- AWS CLI
-
例 - プレイスメントグループ戦略を使用して、AWS Command Line Interfaceから複数のプライマリノードを持つインスタンスフリートクラスターを起動する
RunJobFlow アクションを使用して複数のプライマリノードを持つ Amazon EMR クラスターを作成する場合、PlacementGroupConfigs
プロパティを以下のように設定します。現在、MASTER
インスタンスロールは、自動的に SPREAD
をプレイスメントグループ戦略として使用します。
aws emr create-cluster \
--name "ha-cluster" \
--placement-group-configs InstanceRole=MASTER \
--release-label emr-6.15.0 \
--instance-fleets '[
{
"InstanceFleetType": "MASTER",
"TargetOnDemandCapacity": 3,
"TargetSpotCapacity": 0,
"LaunchSpecifications": {
"OnDemandSpecification": {
"AllocationStrategy": "lowest-price"
}
},
"InstanceTypeConfigs": [
{
"WeightedCapacity": 1,
"BidPriceAsPercentageOfOnDemandPrice": 100,
"InstanceType": "m5.xlarge"
},
{
"WeightedCapacity": 1,
"BidPriceAsPercentageOfOnDemandPrice": 100,
"InstanceType": "m5.2xlarge"
},
{
"WeightedCapacity": 1,
"BidPriceAsPercentageOfOnDemandPrice": 100,
"InstanceType": "m5.4xlarge"
}
],
"Name": "Master - 1"
},
{
"InstanceFleetType": "CORE",
"TargetOnDemandCapacity": 5,
"TargetSpotCapacity": 0,
"LaunchSpecifications": {
"OnDemandSpecification": {
"AllocationStrategy": "lowest-price"
}
},
"InstanceTypeConfigs": [
{
"WeightedCapacity": 1,
"BidPriceAsPercentageOfOnDemandPrice": 100,
"InstanceType": "m5.xlarge"
},
{
"WeightedCapacity": 2,
"BidPriceAsPercentageOfOnDemandPrice": 100,
"InstanceType": "m5.2xlarge"
},
{
"WeightedCapacity": 4,
"BidPriceAsPercentageOfOnDemandPrice": 100,
"InstanceType": "m5.4xlarge"
}
],
"Name": "Core - 2"
}
]' \
--ec2-attributes '{
"KeyName": "ec2_key_pair_name",
"InstanceProfile": "EMR_EC2_DefaultRole",
"SubnetIds": [
"subnet-22XXXX01",
"subnet-22XXXX02"
]
}' \
--service-role EMR_DefaultRole \
--applications Name=Hadoop Name=Spark
-
ha-cluster
を自分の高可用性クラスター名に置き換えます。
-
ec2_key_pair_name
をこのクラスターの EC2 キーペアの名前に置き換えます。EC2 キーペアはオプションであり、SSH を使用してクラスターにアクセスする場合にのみ必須です。
-
subnet-22XXXX01
および subnet-22XXXX02
は、お使いのサブネット ID に置き換えてください。
プレイスメントグループ戦略を使用せずに複数プライマリノードを持つクラスターを起動する
プレイスメントグループ戦略を使用しないで複数プライマリノードを持つクラスターでプライマリノードを起動する場合、次のいずれかを実行する必要があります。
-
プレイスメントグループ管理ポリシー AmazonElasticMapReducePlacementGroupPolicy
を Amazon EMRrole から削除する、または
-
Amazon EMRAPI または CLI を使用して placement-group-configs
パラメータを指定し、NONE
をプレイスメントグループ戦略として選択して、複数のプライマリノードを持つクラスターを起動します。
- Amazon EMR API
-
例 – Amazon EMRAPI を使用するプレイスメントグループ戦略を使用しないで、複数のプライマリノードを持つクラスターを起動します。
RunJobFlow アクションを使用して複数のプライマリノードを持つクラスターを作成する場合は、PlacementGroupConfigs
プロパティを以下のように設定します。
{
"Name":"ha-cluster",
"PlacementGroupConfigs":[
{
"InstanceRole":"MASTER",
"PlacementStrategy":"NONE"
}
],
"ReleaseLabel":"emr-5.30.1",
"Instances":{
"ec2SubnetId":"subnet-22XXXX01",
"ec2KeyName":"ec2_key_pair_name",
"InstanceGroups":[
{
"InstanceCount":3,
"InstanceRole":"MASTER",
"InstanceType":"m5.xlarge"
},
{
"InstanceCount":4,
"InstanceRole":"CORE",
"InstanceType":"m5.xlarge"
}
]
},
"JobFlowRole":"EMR_EC2_DefaultRole",
"ServiceRole":"EMR_DefaultRole"
}
-
ha-cluster
を自分の高可用性クラスター名に置き換えます。
-
subnet-22XXXX01
をサブネット ID に置き換えます。
-
ec2_key_pair_name
をこのクラスターの EC2 キーペアの名前に置き換えます。EC2 キーペアはオプションであり、SSH を使用してクラスターにアクセスする場合にのみ必須です。
- Amazon EMR CLI
-
例 — Amazon EMRCLI を使用するプレイスメントグループ戦略を使用せずに、複数のプライマリノードを持つクラスターを起動します。
RunJobFlow アクションを使用して複数のプライマリノードを持つクラスターを作成する場合は、PlacementGroupConfigs
プロパティを以下のように設定します。
aws emr create-cluster \
--name "ha-cluster" \
--placement-group-configs InstanceRole=MASTER,PlacementStrategy=NONE \
--release-label emr-5.30.1 \
--instance-groups InstanceGroupType=MASTER,InstanceCount=3,InstanceType=m5.xlarge InstanceGroupType=CORE,InstanceCount=4,InstanceType=m5.xlarge \
--ec2-attributes KeyName=ec2_key_pair_name,InstanceProfile=EMR_EC2_DefaultRole,SubnetId=subnet-22XXXX01 \
--service-role EMR_DefaultRole \
--applications Name=Hadoop Name=Spark
-
ha-cluster
を自分の高可用性クラスター名に置き換えます。
-
subnet-22XXXX01
をサブネット ID に置き換えます。
-
ec2_key_pair_name
をこのクラスターの EC2 キーペアの名前に置き換えます。EC2 キーペアはオプションであり、SSH を使用してクラスターにアクセスする場合にのみ必須です。
複数のプライマリノードを持つクラスターにアタッチされたプレイスメントグループ戦略設定の確認
Amazon EMR クラスター記述 API を使用して、複数のプライマリノードを持つクラスターにアタッチされたプレイスメントグループ戦略の設定を確認できます。
aws emr describe-cluster --cluster-id "j-xxxxx"
{
"Cluster":{
"Id":"j-xxxxx",
...
...
"PlacementGroups":[
{
"InstanceRole":"MASTER",
"PlacementStrategy":"SPREAD"
}
]
}
}